O comando / argumentos PsExec
que você deu em seu exemplo está malformado. Tente:
C:\Tools\PsExec.exe \server2 -u "domain\admin" -p "abcd" "C:\Install.bat" -i -d -f -w
Além disso, junte tudo com um exemplo adaptado de algo que escrevi anteriormente. PSExecRetry.log
conterá a saída de PsExec
(incluindo erros), embora não capture a saída StdOut/StdErr
do comando subsequente como está.
PSExecRetry.ps1
é o script do PowerShell com alguma lógica básica de repetição:
#PSExecRetry.ps1
$LogFile = "PSExecRetry.log"
$defaultSleepSecs = 3
$RetryCount = 3
$StopLoop = $false
$retries = 1
try {
# open the log file
Start-Transcript -path $LogFile -append
do {
try
{
$Command = "C:\PSInstall.bat"
Write-Host "Executing command" $Command ".'r"
Invoke-Expression -Command $Command
if ($LastExitcode -ne 0)
{
throw "Retry {0} of {1}" -f $retries, $RetryCount
}
else
{
$StopLoop = $true
}
}
catch
{
if ($retries -gt $RetryCount)
{
Write-Host("Exception.Message={0}; InvocationInfo.ScriptName={1}" -f $_.Exception.Message, $_.InvocationInfo.ScriptName)
Write-Host("Giving up after {0} retries.'r" -f $RetryCount)
$StopLoop = $true
}
else
{
Write-Host("Exception.Message={0}; InvocationInfo.ScriptName={1}" -f $_.Exception.Message, $_.InvocationInfo.ScriptName)
Write-Host("Exception, retrying in {0} seconds.'r" -f $defaultSleepSecs)
Start-Sleep -Seconds $defaultSleepSecs
$retries = $retries + 1
}
}
} While ($StopLoop -eq $false)
}
catch
{
Write-Host("Exception.Message={0}; InvocationInfo.ScriptName={1}" -f $_.Exception.Message, $_.InvocationInfo.ScriptName)
}
finally
{
Stop-Transcript
}
PSInstall.cmd
é modificado da seguinte forma:
#PSInstall.cmd
C:\PsExec.exe \server2 -u "domain\admin" -p "abcd" "C:\Install.bat" -i -d -f -w
Install.bat
stub:
#Install.bat
echo Hello world!