循环批处理,也许我错过了什么

时间:2012-04-27 13:19:59

标签: batch-file for-loop cmd psexec

我知道我可以使用Powershell执行此操作,但是,更多的是作为练习我的命令提示符脚本技能的项目,想要使用批处理文件。我有一个带有ComputerNames的txt文件,我希望我的循环回显该名称,然后运行SystemInfo并从结果中获取一个特定的行。

Computers.txt如下所示:

 XPCOMPUTER1
 XPCOMPUTER2
 W7COMPUTER1
 W7COMPUTER2

我的批处理文件如下所示:

For /F %%w IN (computer.txt) Do (echo %%w & psexec \\%%w cmd.exe & 
systeminfo | Find "Total Physical Memory:")

应该列出主机名,然后将PSexec列入其中并运行SystemInfo并获取总物理内存,对吧?我是这么想的!但是我得到了

%%W was unexpected at this time. 

有什么想法?

2 个答案:

答案 0 :(得分:2)

我认为您需要将systeminfo作为参数传递给cmd psexec,如下所示:

For /F %%w IN (computer.txt) Do (echo %%w & psexec \\%%w cmd.exe /c systeminfo | Find "Total Physical Memory:")

否则,您刚刚执行cmd,然后systeminfosysteminfo未从cmd开始运行。

此外,除非是拼写错误,否则您在脚本中写了computer.txt,并说它被称为computers.txt

我不确定这是否能解决问题,但值得一试。

答案 1 :(得分:0)

所以事实证明,解决这个问题的最佳方法是使用psexec直接调用systeminfo。

For /F %%w IN (computer.txt) Do (echo %%w & psexec \\%%w systeminfo | Find "Total Physical Memory:")

这让我回答:

Total Physical Memory:     8,126 MB

由于我现在学习了PowerShell,我会完全不同地解决这个问题。

ForEach ($computer in (Get-Content Computer.txt) { 
  Get-CIMInstance -ComputerName $Computer -Class Win32_ComputerSystem | `    
Select Name,@{N='RAM(MB)';E={[int]($_.TotalPhysicalMemory /1mb)}}

结果是:

Name       RAM(MB)
----       -------
AL-1NG43Q1    8126
LOCALHOST     8126
127.0.0.1     8126