【问题标题】:Powershell - run PsExec on multiple servers at the same timePowershell - 同时在多台服务器上运行 PsExec
【发布时间】:2014-03-22 15:40:31
【问题描述】:

如何在多台服务器上并行运行PsExec,并将结果输出到文本文件?比如:

ForEach ($s in $Srvs) {
    Psexec -s -d \\$s someexe.exe > \\$s\c$\temp\$s.txt
}

这在没有-d 选项的情况下有效,但是我添加-d 后,输出为空白。

我在 PS 工作流程中尝试了Invoke-Command, Start-Process 等,但没有任何管道选项“>”存在。我也试过2>2>$&1,不行。

有什么想法吗?

【问题讨论】:

    标签: powershell psexec


    【解决方案1】:

    我怀疑发生了什么:

    • PsExec 在您的计算机上运行。
    • 它创建到服务器的连接并启动 someexe.exe。
    • 在服务器上运行,向 PsExec 输出回复。
    • PsExec 在本地获取输出,并在本地计算机上打印。
    • > 通过网络将其重定向到服务器上的管理员共享。

    当您使用 -d 时,PsExec 在从 someexe.exe 获取任何内容之前退出,因此文件最终为空。

    您需要转义>,以便将其作为参数传递给远程命令,而不是在本地解释。我不确定如何在 PowerShell 中正确执行此操作,在命令提示符下,转义字符将是 ^,这似乎在 PowerShell 中有效,所以也许:

    ForEach ($s in $Srvs) {
        Psexec -s -d \\$s someexe.exe ^> \\$s\c$\temp\$s.txt
    }
    

    编辑

    好的,不是这样。我目前的最佳答案是将命令放入批处理文件中,例如c:\scripts\myscript.bat,使其也启动命令解释器:

    cmd /C someexe.exe > c:\temp\%computername%.txt
    

    然后用 PsExec 运行它,将批处理文件复制过来:

    ForEach ($s in $srvs) {
        psexec -s -d -c -f \\$s c:\scripts\myscript.bat
    }
    

    【讨论】:

    • @Rishi 同样的事情发生在我身上;已经用 EDIT 和另一个建议更新了我的答案。
    • 我同意它会起作用,但它违背了我创建自依赖工具的目的。然后我必须首先在所有服务器上提供脚本!
    • @Rishi -c 选项告诉 psexec 在运行之前将脚本复制到远程计算机,如果已经存在,-f 覆盖。
    最近更新 更多