2014-04-16 81 views
5

第一篇文章,所以请不要伤害我。我四处搜寻,但似乎无法找到一种方法来做我想做的事。我已经制作了一个脚本,可以将文件夹复制到\ $ computer \ c $的许多计算机上。在这些文件夹中是运行.exe的批处理文件。我想要做的是从我用来复制该文件夹的相同computers.txt获取Powershell,然后使用psexec运行该批处理文件。我可以手动完成这一切,但脚本似乎是一个问题,这是我认为会工作,但显然不是。使用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" 
} 

}

+0

这是实际的脚本复制和粘贴?或者只是重新键入,可能有一些错别字? – TheMadTechnician

+0

我复制/粘贴它。我在Powershell中使用脚本非常新手,如果语法太糟糕,我很抱歉。 – noz3r0

+0

尽量不要使用PowerShell psexec,我得到很多问题在这... –

回答

8

好吧,让我们从最高层开始。

$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子句和foreach循环else子句。

} 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" 
    } 
} 
+0

好吧,我看到我可以缩小一点。感谢您的全面细分。我现在的问题是,我无法使Psexec函数正常工作,我不确定我做错了什么。如果我这样做手动,我会打开一个命令提示符并键入 'psexec \\ hostname cmd'然后我将在该机器命令提示符,从中我可以导航到我想要的文件夹并运行批处理文件。 – noz3r0

+0

你确定它失败了吗?如果您在PowerShell ISE中运行它,PSExec将会抛出一个错误,并且仍然有效。这是有原因的,它与PSExec如何输出数据有关,其中一些输出到标准输出流,其中一些输出到错误流。无论如何,你确定它不工作? – TheMadTechnician

+0

我看到你在那里扔了一个编辑,我的最后脚本不像你有什么,我会在早上给你一个去,让你知道。它似乎应该工作。感谢您的勤奋。 – noz3r0

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

} 
+0

虚假警报。它不会像这样运行psexec,并称它不是一个有效的cmdlet。有没有一个命令来运行可执行文件? – noz3r0

0

使用&(电话)运营商, & psexec \ $计算机“C:\ Folder \ install。蝙蝠“

4

我意识到这个问题是从2014年开始的,这个答案不会直接解决用户提出的问题,但对于现在遇到这个问题的人来说,我想扔掉那个你没有需要*如果你正在使用PowerShell的使用PSEXEC。既然你在PowerShell中是已经,只是用Invoke-Command

语法将

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

它就是这么简单。

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

+1

这是一个粗略的过度简化。如果install.bat需要双跳,这将不起作用。 –