将CMD结果传递给批处理文件中的变量

时间:2012-10-02 15:33:38

标签: variables scripting batch-file

我正在尝试使用PSTools安装应用程序和一组服务,但我想考虑到我尝试连接的计算机可能已关闭或在另一个网络上,但无法从内部网络。

基本上如果无法通过管理员共享访问该计算机,这就是我收到的消息:

  

无法访问 MachineName
  找不到网络路径   确保在 MachineName 上启用了默认的admin $共享。

这是我用来尝试捕获“错误消息”的语法,然后报告如果安装成功与否(取决于它是否可以联系机器)

@echo off
set /p name=What is the machine name?: 
psexec.exe \\%name% -u *useraccount* -p *password* \\ServerName\installation.bat
FOR /F "tokens=*" %%A IN ('COMMAND ^| FIND "Couldn't access"') DO SET Error=%%A
If "%Error%"=="Couldn't access" 
ECHO Installation Failed.
Else
ECHO Installtion complete.  
Pause
exit

目前,它正在定义错误变量。无法弄清楚我在这里出了什么问题。

1 个答案:

答案 0 :(得分:1)

'COMMAND ^| FIND "Couldn't access"'打开一个命令shell,这就是它挂起的原因。在退出shell之前不会继续。

您需要查看将错误消息重定向到另一个文件。 psexec行上的2>Errors.txt将为您提供一个要在下一行搜索的文件。

这将使批处理文件看起来像这样:

@echo off
set /p name=What is the machine name?: 
psexec.exe \\\%name% ... \\\ServerName\installation.bat 1>Error.txt 2>&1 
for /f "tokens=*" %%A in ('FIND /i error.txt "Couldn't Access"') do SET Error=%%A
If not x%ERROR:Couldn=%==x%ERROR% (
ECHO Installation Failed.
) Else (
ECHO Installtion complete.  
)
Pause
exit

(另外,请注意使用括号制作多线IF)
检查if是否会看到Couldn是否是字符串的一部分,因为直接比较将不起作用,因为您必须检查整个字符串,包括机器名称