Pergunta

Como é possível executar um script PowerShell sem exibir uma janela ou qualquer outro sinal de o usuário?

Em outras palavras, o script deve ser executado silenciosamente em segundo plano, sem qualquer sinal para o usuário.

Crédito extra para uma resposta que não utiliza componentes de terceiros:)

Foi útil?

Solução

Você pode executá-lo assim (mas isso mostra um Windows para um tempo):

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

Ou você usa um arquivo helper eu criei para evitar a janela chamada PsRun.exe que faz exatamente isso. Você pode baixar fonte e exe executar tarefas agendadas com WinForm GUI em PowerShell . Eu usá-lo para tarefas agendadas.

Editado:. Como Marco observou este parâmetro -windowstyle está disponível apenas para V2

Outras dicas

Você pode usar o PowerShell Community Extensions e fazer isso:

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

Você também pode fazer isso com VBScript: http://blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/

(Via este tópico do fórum ).

Aqui está uma abordagem que que não requer argumentos de linha de comando ou um lançador separado. Não é completamente invisível porque uma janela mostra momentaneamente na inicialização. Mas, em seguida, desaparece rapidamente. Onde isso é OK, isto é, penso eu, a abordagem mais fácil se você deseja iniciar o script clicando duas vezes no Explorer, ou através de um atalho no menu Iniciar (incluindo, claro, o submenu Startup). E eu gosto dessa parte que da do código do script em si, e não algo externo.

Coloque isso na frente de seu 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)

Eu estava tendo esse mesmo problema. Eu descobri se você vá para o Task na Agendador de Tarefas que está executando o powershell.exe script, você pode clicar em " Executar se o usuário está conectado ou não ", e que nunca vai mostrar a janela do PowerShell quando a tarefa é executada.

Eu estava tendo este problema durante a execução do c #, no Windows 7, o serviço "Detecção de Serviços Interativa" foi surgindo ao executar uma janela do PowerShell escondido como a conta SYSTEM.

Usando o parâmetro "CreateNoWindow" impediu o serviço ISD aparecendo lo de aviso.

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

Aqui está uma frase:

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

Embora seja possível para que isso piscar uma janela muito brevemente, que deve ser uma ocorrência rara.

Eu acho que a melhor maneira de esconder a tela do console do PowerShell quando você estiver executando um scripts de fundo é este código " resposta-hide-prompt de comando-mas-não-a-gui Bluecakes " ).

Eu adicionar este código no início de todos os meus scripts do PowerShell que eu preciso para executar em segundo plano.

# .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 esta resposta foi ajudá-lo, por favor, voto a " Bluecakes" em sua resposta neste post.

Eu criei uma pequena ferramenta que passa a chamada para qualquer ferramenta de console que você deseja iniciar janelas até o arquivo original:

https://github.com/Vittel/RunHiddenConsole

Depois de compilar apenas mudar o nome do executável para " w.exe" (anexar um "w"), e colocá-lo ao lado do executável original. Você pode então chamar por exemplo powershellw.exe com os parâmetros usuais e não vai aparecer uma janela.

Se alguém tem uma idéia de como verificar se o processo criado está à espera para a entrada, mal estar feliz para incluir sua solução:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top