2009-11-26 80 views
76

Come è possibile eseguire uno script PowerShell senza visualizzare una finestra o qualsiasi altro segno per l'utente?Come eseguire uno script PowerShell senza visualizzare una finestra?

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

credito supplementare per una risposta che non fa uso di componenti di terze parti :)

+0

Checkout questa domanda, se siete interessati ad imparare: http://stackoverflow.com/questions/573623/powershell -vs-unix-shells –

risposta

82

è possibile eseguirlo come questo (ma questo mostra una finestra per un po '):

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

Oppure si utilizza un file di aiuto che ho creato per evitare la finestra denominata PsRun.exe che fa esattamente questo. È possibile scaricare il file di origine e exe Run scheduled tasks with WinForm GUI in PowerShell. Lo uso per le attività programmate.

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

+1

Un buon consiglio. Ne ho bisogno anche per un compito programmato :) –

+7

Per chi arriva e prova questo, è necessario PowerShell v2 per ottenere il parametro -WindowStyle. –

+3

Ho compilato PsRun, tuttavia, se lo aggiungo all'attività pianificata, lampeggia anche una finestra ... – Ciantic

4

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

L'utilizzo del parametro "CreateNoWindow" ha impedito l'attivazione del servizio ISD.

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

Ecco un approccio che non richiede argomenti della riga di comando o un programma di avvio separato. Non è completamente invisibile perché una finestra viene visualizzata momentaneamente all'avvio. Ma poi svanisce rapidamente. Ovviamente, questo è, penso, l'approccio più semplice se si desidera avviare lo script facendo doppio clic su explorer o tramite un collegamento del menu Start (incluso, ovviamente, il sottomenu Startup). E mi piace che faccia parte del codice della sceneggiatura stessa, non di qualcosa di esterno.

Mettete questo nella parte anteriore del vostro 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) 
2

Ecco una battuta:

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

Anche se è possibile per questo a lampeggiare una finestra molto brevemente, che dovrebbe essere una rara occorrenza.

1

Penso che il modo migliore per nascondere lo schermo della console di PowerShell quando si eseguono script in background è this code (risposta "Bluecakes").

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 è stata di aiuto voi, si prega di votare per "Bluecakes" in his answer in this post.

Problemi correlati