Domanda

Come è possibile eseguire uno script PowerShell senza visualizzare una finestra o altri segni su l'utente?

In altre parole, lo script dovrebbe essere eseguito silenziosamente in background senza alcun segno per l'utente.

Credito extra per una risposta che non utilizza componenti di terze parti :)

È stato utile?

Soluzione

Puoi eseguirlo in questo modo (ma questo mostra una finestra per un po '):

PowerShell.exe -windowstyle hidden { your script.. }

Oppure usi un file di supporto che ho creato per evitare la finestra chiamata PsRun.exe che fa esattamente questo. Puoi scaricare il file sorgente ed exe Esegui attività pianificate con la GUI di WinForm in PowerShell . Lo uso per attività pianificate.

Modificato: come notato da Marco questo parametro -windowstyle è disponibile solo per V2.

Altri suggerimenti

Puoi utilizzare le Estensioni della community di PowerShell e procedere come segue:

start-process PowerShell.exe -arg $pwd\foo.ps1 -WindowStyle Hidden

Puoi farlo anche con VBScript: http://blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/

(Via questo thread del forum ).

Ecco un approccio che non richiede argomenti da riga di comando o un launcher separato. Non è completamente invisibile perché una finestra viene mostrata momentaneamente all'avvio. Ma poi svanisce rapidamente. Dove va bene, questo è, a mio avviso, l'approccio più semplice se si desidera avviare lo script facendo doppio clic in Esplora risorse o tramite un collegamento del menu Start (incluso, ovviamente, il sottomenu Startup). E mi piace che sia parte del codice dello script stesso, non qualcosa di esterno.

Metti questo in primo piano nel tuo script:

$t = '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);'
add-type -name win -member $t -namespace native
[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0)

Stavo riscontrando lo stesso problema. Ho scoperto che se vai su Attività in Utilità di pianificazione che esegue lo script powershell.exe , puoi fare clic su & Quot; Esegui se l'utente ha effettuato l'accesso o meno " e che non mostrerà mai la finestra di PowerShell quando viene eseguita l'attività.

Stavo riscontrando questo problema durante l'esecuzione da c #, su Windows 7, il " Rilevamento servizi interattivi " il servizio stava spuntando quando si eseguiva una finestra nascosta PowerShell come account SYSTEM.

Uso del " CreateNoWindow " Il parametro ha impedito al servizio ISD di visualizzare il relativo avviso.

process.StartInfo = new ProcessStartInfo("powershell.exe",
    String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand))
{
   WorkingDirectory = executablePath,
   UseShellExecute = false,
   CreateNoWindow = true
};

Ecco una riga:

mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")

Sebbene sia possibile per questo far lampeggiare una finestra molto brevemente, dovrebbe essere un evento raro.

Penso che il modo migliore per nascondere la schermata della console di PowerShell quando si esegue uno script in background è questo codice (" Bluecakes " answer).

Aggiungo questo codice all'inizio di tutti i miei script PowerShell che devo eseguire in background.

# .Net methods for hiding/showing the console in the background
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'
function Hide-Console
{
    $consolePtr = [Console.Window]::GetConsoleWindow()
    #0 hide
    [Console.Window]::ShowWindow($consolePtr, 0)
}
Hide-Console
  

Se questa risposta ti è stata di aiuto, vota <> quot;! Bluecakes <> quot!; nella sua risposta in questo post.

Ho creato un piccolo strumento che passa la chiamata a qualsiasi strumento console che desideri avviare senza finestre fino al file originale:

https://github.com/Vittel/RunHiddenConsole

Dopo la compilazione, basta rinominare l'eseguibile in " < targetExecutableName > w.exe " (aggiungi un " w ") e mettilo accanto all'eseguibile originale. È quindi possibile chiamare e.G. powershellw.exe con i soliti parametri e non farà apparire una finestra.

Se qualcuno ha un'idea su come verificare se il processo creato è in attesa di input, sarà felice di includere la soluzione :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top