使用Powershell运行Psexec命令

noz*_*3r0 9 powershell batch-file psexec

第一篇文章所以请不要伤害我.我四处寻找,但似乎找不到办法做我想做的事.我制作了一个脚本,将我拥有的文件夹复制到\ $ computer\c $中的众多计算机上.在这些文件夹中是一个运行.exe的批处理文件.我想要做的是从我用于复制文件夹的相同computers.txt中获取Powershell,然后使用psexec运行批处理文件.我可以手动完成这一切,但脚本似乎是一个问题,这是我认为可以工作,但显然不是.

    $computers = gc "C:\scripts\computers.txt"

foreach ($computer in $computers) {
if (test-Connection -Cn $computer -quiet) {
    cd C:\pstools
    psexec \\%computer cmd
    C:\Folder\install.bat"
} else {
    "$computer is not online"
}
Run Code Online (Sandbox Code Playgroud)

}

The*_*ian 12

好吧,让我们从顶部开始吧.

$computers = gc "C:\scripts\computers.txt"
Run Code Online (Sandbox Code Playgroud)

这会将"computers.txt"文件的内容加载到变量中$computers.很简单,那里没有问题.

接下来我们有一个ForEach循环.它会分割内容$computers并处理每一行(可能是计算机的名称),$computer而不是大括号内的所有代码.

foreach ($computer in $computers) {
Run Code Online (Sandbox Code Playgroud)

该循环以标准的If-Then语句启动.如果(condition)那么{do stuff}.在这种情况下,它正在测试是否$computer在网络上可用.如果是,则尝试在其上运行PSExec.如果它不在线它运行Else子句,我们将在一秒钟内完成.

if (test-Connection -Cn $computer -quiet) {
Run Code Online (Sandbox Code Playgroud)

然后它改变目录.有点无意义,但没关系,无论如何.您可以明确地调用它,例如C:\PSTools\PSExec.exe <arguments>并保存一行,但实际上没有任何损害.

cd C:\pstools
Run Code Online (Sandbox Code Playgroud)

然后你正在调用PSExec,虽然这里有一点语法错误.应该$computer而不是%computer.此外,它应该只有你想要执行cmd的命令,而不是第二行的命令.如果使用Call运算符(&)使powershell意识到它正在尝试执行某些操作而不是运行cmdlet或函数或者不运行cmdlet或函数,则可能会有更好的结果.

& psexec \\$computer C:\Folder\install.bat
Run Code Online (Sandbox Code Playgroud)

之后是Else子句,说明计算机是否在线写入字符串"$ computer is not online",然后关闭Else子句和ForEach循环的大括号.

} else {
    "$computer is not online"
}


}
Run Code Online (Sandbox Code Playgroud)

编辑:好的,你完成的脚本看起来应该是这样的(如果路径中有空格,则在引号中包含目标):

$computers = gc "C:\scripts\computers.txt"

foreach ($computer in $computers) {
    if (test-Connection -Cn $computer -quiet) {
        & C:\pstools\psexec.exe \\$computer "C:\folder\install.bat"
    } else {
        "$computer is not online"
    }
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*ard 6

我意识到这个问题来自2014年,这个答案将不会直接解决用户提出的问题。但是对于这些天来遇到这个问题的人,如果您使用PowerShell那么我想抛弃那些不需要*来使用PSExec的人。由于您已经在PowerShell中,只需使用即可Invoke-Command

语法将是

Invoke-Command -ComputerName $Computer -ScriptBlock { C:\Folder\install.bat }
Run Code Online (Sandbox Code Playgroud)

真的很容易。

*要求在目标服务器上启用PowerShell远程处理。

  • 这是过分的简化。如果install.bat需要双击,则此操作将无效。 (2认同)
  • “*PowerShell 远程处理”是一个显着的差异,特别是对于可能未配置为支持它的生产环境。*默认情况下* Win2016/Win10 及更早版本启用 PSExec 远程处理并禁用 WinRM。 (2认同)