好的,那么让我们从头开始吧。
$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
和命令。如果您使用调用运算符(&
),使PowerShell意识到它正在尝试执行某些内容而不是运行命令或函数等,则可能会获得更好的结果。
& psexec \\$computer C:\Folder\install.bat
接下来是Else子句,如果计算机不在线,则写入字符串“$ computer is not online”,后跟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"
}
}