使用Powershell运行Psexec命令

时间:2014-04-16 20:28:28

标签: batch-file powershell 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"
}

}

4 个答案:

答案 0 :(得分:11)

好的,让我们从顶部开始。

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

加载" computers.txt"的内容。将文件放入变量$computers。很简单,那里没有问题。

接下来我们有一个ForEach循环。它将$computers的内容拆分,并将每一行(可能是计算机的名称)处理为$computer,反对大括号内的所有代码。

foreach ($computer in $computers) {

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

if (test-Connection -Cn $computer -quiet) {

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

cd C:\pstools

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

& psexec \\$computer C:\Folder\install.bat

之后是Else条款,说明计算机是否在线写字符串&#34; $ computer不在线&#34;然后关闭Else子句和ForEach循环的大括号。

} else {
    "$computer is not online"
}


}

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

$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"
    }
}

答案 1 :(得分:4)

我意识到这个问题是从2014年开始的,这个答案不能直接解决用户提出的问题。但是对于那些现在遇到这个问题的人来说,如果你使用的是PowerShell ,我想抛出你不需要*使用PSExec。由于您已经在PowerShell中,因此只需使用Invoke-Command

语法将是

Invoke-Command -ComputerName $Computer -ScriptBlock { C:\Folder\install.bat }

这真的很容易。

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

答案 2 :(得分:1)

试一试。您有一个%,您想要$。此外,还不需要cmd.exe调用。

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

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

}

答案 3 :(得分:0)

使用&amp; (call)operator,&amp; psexec \ $ computer&#34; C:\ Folder \ install.bat&#34;