Como executar um script PowerShell sem exibir uma janela?
-
05-07-2019 - |
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:)
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/
-
noreferrer agendar tarefas Invisível PowerShell (Internet Archive)
-
Mais diversão com o PowerShell programada (Internet Archive)
(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 "
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:)