运行 通过 PowerShell 在远程服务器上执行批处理脚本
Running Batch Script on remote Server via PowerShell
我需要从客户端(与服务器同域)连接到一些远程服务器一旦连接,我需要运行一个批处理文件:
我已经用这段代码完成了:
$Username = 'USER'
$Password = 'PASSWORD'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass
try {
Invoke-Command -ComputerName "SERVER1" -Credential $Cred -ScriptBlock -ErrorAction Stop {
Start-Process "C:\Users\nithi.sundar\Desktop\Test.bat"
}
} catch {
Write-Host "error"
}
这个脚本没有给出任何错误,但它似乎没有在执行批处理脚本。
如有任何意见,我们将不胜感激。
尝试替换
invoke-command -computername "SERVER1" -credential $Cred -ScriptBlock -ErrorAction stop { Start-Process "C:\Users\nithi.sundar\Desktop\Test.bat" }
和
Invoke-Command -ComputerName "Server1" -credential $cred -ErrorAction Stop -ScriptBlock {Invoke-Expression -Command:"cmd.exe /c 'C:\Users\nithi.sund
ar\Desktop\Test.bat'"}
您发布的代码 运行 不可能没有错误,因为您弄乱了 Invoke-Command
的参数顺序。这个:
Invoke-Command ... -ScriptBlock -ErrorAction Stop { ... }
实际上应该是这样的:
Invoke-Command ... -ErrorAction Stop -ScriptBlock { ... }
此外,请勿为此使用Invoke-Expression
。 practically always the wrong tool 可满足您需要完成的任何任务。您也不需要 Start-Process
,因为 PowerShell 可以 运行 直接批处理脚本:
Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
C:\Users\nithi.sundar\Desktop\Test.bat
} -Credential $Cred -ErrorAction Stop
如果命令是字符串而不是裸词,则需要使用 call operator,不过:
Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
& "C:\Users\nithi.sundar\Desktop\Test.bat"
} -Credential $Cred -ErrorAction Stop
您也可以使用 cmd.exe
:
调用批处理文件
Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
cmd /c "C:\Users\nithi.sundar\Desktop\Test.bat"
} -Credential $Cred -ErrorAction Stop
如果出于某种原因必须使用 Start-Process
,则应添加参数 -NoNewWindow
和 -Wait
。
Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
Start-Process 'C:\Users\nithi.sundar\Desktop\Test.bat' -NoNewWindow -Wait
} -Credential $Cred -ErrorAction Stop
默认情况下 Start-Process
运行 异步调用进程(即立即调用 returns)并在单独的 window 中。这很可能是您的代码未按预期工作的原因。
我需要从客户端(与服务器同域)连接到一些远程服务器一旦连接,我需要运行一个批处理文件:
我已经用这段代码完成了:
$Username = 'USER'
$Password = 'PASSWORD'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass
try {
Invoke-Command -ComputerName "SERVER1" -Credential $Cred -ScriptBlock -ErrorAction Stop {
Start-Process "C:\Users\nithi.sundar\Desktop\Test.bat"
}
} catch {
Write-Host "error"
}
这个脚本没有给出任何错误,但它似乎没有在执行批处理脚本。
如有任何意见,我们将不胜感激。
尝试替换
invoke-command -computername "SERVER1" -credential $Cred -ScriptBlock -ErrorAction stop { Start-Process "C:\Users\nithi.sundar\Desktop\Test.bat" }
和
Invoke-Command -ComputerName "Server1" -credential $cred -ErrorAction Stop -ScriptBlock {Invoke-Expression -Command:"cmd.exe /c 'C:\Users\nithi.sund
ar\Desktop\Test.bat'"}
您发布的代码 运行 不可能没有错误,因为您弄乱了 Invoke-Command
的参数顺序。这个:
Invoke-Command ... -ScriptBlock -ErrorAction Stop { ... }
实际上应该是这样的:
Invoke-Command ... -ErrorAction Stop -ScriptBlock { ... }
此外,请勿为此使用Invoke-Expression
。 practically always the wrong tool 可满足您需要完成的任何任务。您也不需要 Start-Process
,因为 PowerShell 可以 运行 直接批处理脚本:
Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
C:\Users\nithi.sundar\Desktop\Test.bat
} -Credential $Cred -ErrorAction Stop
如果命令是字符串而不是裸词,则需要使用 call operator,不过:
Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
& "C:\Users\nithi.sundar\Desktop\Test.bat"
} -Credential $Cred -ErrorAction Stop
您也可以使用 cmd.exe
:
Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
cmd /c "C:\Users\nithi.sundar\Desktop\Test.bat"
} -Credential $Cred -ErrorAction Stop
如果出于某种原因必须使用 Start-Process
,则应添加参数 -NoNewWindow
和 -Wait
。
Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
Start-Process 'C:\Users\nithi.sundar\Desktop\Test.bat' -NoNewWindow -Wait
} -Credential $Cred -ErrorAction Stop
默认情况下 Start-Process
运行 异步调用进程(即立即调用 returns)并在单独的 window 中。这很可能是您的代码未按预期工作的原因。