Estou tentando executar um script existente em um servidor remoto e capturar a saída em um arquivo local

StackOverflow https://stackoverflow.com//questions/24055009

Pergunta

Eu quero executar isso em vários servidores(cerca de 40-50 servidores), paralelamente

$Username = "user"

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {c:\temp\PsExec.exe -h \\$server -u $Username -p $password cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$env:userprofile\Desktop\output.txt"} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb
}

este código funciona bem se eu remover iniciar o trabalho, mas executa um após o outro, o que leva muito tempo.

Eu não posso usar PSsession ou invoke-command, pois é restrito em nosso ambiente.

Este código nunca sai.Ele pára nessa posição:

 + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com
Foi útil?

Solução

Para Começar você não está passando qualquer uma de suas variáveis para o trabalho.O que você precisa é usar o $args variável dentro do ScriptBlock e, em seguida, passar as variáveis que você deseja com -ArgumentList.

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {
  c:\temp\PsExec.exe -h \\$args[0] -u $args[1] -p $args[2] cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$args[3]\Desktop\output.txt"
} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb -ArgumentList $server,$Username,$password,$env:userprofile
}

Eu provavelmente não precisa passar a variável de ambiente, mas parecia que você tinha um problema escopo com as variáveis.

Alternativamente, você pode usar um Bloco de Parâmetro no ScriptBlock para nomear suas Variáveis, o que, essencialmente, mapas posicionalmente os Argumentos passados para a variável nomeada.

$Password = "Password"

$servers = get-content "c:\temp\servers.txt"

$sb = {
  Param ($Server,$UserName,$Password,$UserProfile)

  c:\temp\PsExec.exe -h \\$Server -u $UserName -p $Password cmd.exe /c "echo . | Powershell.exe -executionpolicy bypass -file c:\script.ps1" > "$UserProfile\Desktop\output.txt"
} 

foreach($server in $servers)
{
    start-job -ScriptBlock $sb -ArgumentList $server,$Username,$password,$env:userprofile
}

Espero que isso ajude.Cheers, Chris.

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