通过PowerShell在远程服务器上运行批处理脚本

Ste*_*mar 1 powershell batch-file remote-server

一旦连接,我需要从客户端(与服务器相同的域)连接到一些远程服务器,我需要运行批处理文件:

我用这段代码完成了:

$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"
}
Run Code Online (Sandbox Code Playgroud)

此脚本不会出现任何错误,但似乎没有执行批处理脚本.

对此的任何意见将不胜感激.

Ans*_*ers 6

您发布的代码不可能没有错误地运行,因为您弄乱了Invoke-Command. 这个:

Invoke-Command ... -ScriptBlock -ErrorAction Stop { ... }
Run Code Online (Sandbox Code Playgroud)

实际上应该是这样的:

Invoke-Command ... -ErrorAction Stop -ScriptBlock { ... }
Run Code Online (Sandbox Code Playgroud)

此外,不要使用Invoke-Expression此。对于您需要完成的任何事情,它实际上总是错误的工具。您也不需要,Start-Process因为 PowerShell 可以直接运行批处理脚本:

Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
    C:\Users\nithi.sundar\Desktop\Test.bat
} -Credential $Cred -ErrorAction Stop
Run Code Online (Sandbox Code Playgroud)

如果命令是一个字符串而不是一个简单的词,你需要使用call operator,但是:

Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
    & "C:\Users\nithi.sundar\Desktop\Test.bat"
} -Credential $Cred -ErrorAction Stop
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下命令调用批处理文件cmd.exe

Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
    cmd /c "C:\Users\nithi.sundar\Desktop\Test.bat"
} -Credential $Cred -ErrorAction Stop
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因必须使用Start-Process,则应添加参数-NoNewWindow-Wait.

Invoke-Command -ComputerName "SERVER1" -ScriptBlock {
    Start-Process 'C:\Users\nithi.sundar\Desktop\Test.bat' -NoNewWindow -Wait
} -Credential $Cred -ErrorAction Stop
Run Code Online (Sandbox Code Playgroud)

默认情况下Start-Process异步运行被调用的进程(即调用立即返回)并在单独的窗口中运行。这很可能是您的代码未按预期工作的原因。


小智 5

尝试更换

invoke-command -computername "SERVER1" -credential $Cred -ScriptBlock -ErrorAction stop { Start-Process "C:\Users\nithi.sundar\Desktop\Test.bat" }
Run Code Online (Sandbox Code Playgroud)

Invoke-Command -ComputerName "Server1" -credential $cred -ErrorAction Stop -ScriptBlock {Invoke-Expression -Command:"cmd.exe /c 'C:\Users\nithi.sund
ar\Desktop\Test.bat'"}
Run Code Online (Sandbox Code Playgroud)