我有这个批处理脚本:
@echo off
set server_list=C:\temp\servers.txt
set cab=E:\PHC\wsusscn2.cab
set sass=E:\PHC\SASS\sass.exe
erase c:\sass\error.log
for /f "tokens=1,2*" %%i in (%server_list%) do (
echo %%i
xcopy %cab% \\%%j\c$\sass /Y || echo %%i: ?error description (invalid drive specification, Access denied etc)? >> c:\sass\error.log
xcopy %sass% \\%%j\c$\sass /Y || echo %%i: ?error description (invalid drive specification, Access denied etc)? >> c:\sass\error.log
wmic /node:%%j PROCESS CALL CREATE "cmd /c c:\sass\sass.exe -i c:\sass\wsusscn2.cab -o c:\sass\%%i.csv" || echo %%i: ?error description (RPC server not available etc)? >> c:\sass\error.log
)
pause`
脚本运行正常,问题是,我无法获取error.log文件(问号之间)的错误描述。如果我知道的话,这将有助于为什么操作不成功。我尝试了以下方法:
echo %%i: cab file copy failed - %ERRORLEVEL%
但它总是导致errorlevel 0(显然是echo命令的错误级别)。我尝试了几种方法将errorlevel存储到变量,但总是不成功。此外,errorlevel只给出了我想要的部分,而不是描述,而只是错误的类型。
文件Servers.txt包含一列中服务器的主机名,以及第二列中的IP。
如何提取错误说明?
答案 0 :(得分:0)
使用STDERR解决了问题。这是质疑线的工作形式:
xcopy %cab% \\%%j\c$\sass /Y 2>> C:\SASS\error.log
xcopy %sass% \\%%j\c$\sass /Y 2>> C:\SASS\error.log
wmic /node:%%j PROCESS CALL CREATE "cmd /c c:\sass\sass.exe -i c:\sass\wsusscn2.cab -o c:\sass\%%i.csv" 2>> C:\SASS\error.log
这段代码正是我对error.log文件所需要的。由于此解决方案未说明服务器的主机名,因此我必须将这些行添加到循环的开头:
echo ----------- >> C:\SASS\error.log
echo %%i >> C:\SASS\error.log