批处理文件中是否有办法记录批处理文件的错误和成功?
我正在尝试将文件从我的计算机复制到200台机器(效果很好),但想知道哪个失败以及失败的原因(因为屏幕很快就消失了)。
@echo off
if [%1]==[] goto usage
@echo mapping l: to %1\c$
net use * /delete /y
net use l: \\%1\c$ password /user:%1\administrator
if ERRORLEVEL 1 (
echo failed
net use l: \\%1\c$ password /user:%1\administrator
) else (
goto mappingError
) > command.txt
::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::
@echo copying link file to C: Drive
copy "c:\_\CopyFileToHost\logoff.cmd" l:\
::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::
@echo deleting l: mapping
net use l: /delete /y
@echo off
goto :eof
:usage
@echo Usage: %0 hostname
exit /B 1
:mappingError
@echo Error mapping remote drive, exiting
exit /B 1
答案 0 :(得分:1)
这是简单的日志记录 - 只检查驱动器是否已映射,以及文件名是否显示在映射的驱动器上,并将日志写入桌面。
@echo off
if [%1]==[] goto usage
echo mapping l: to %1\c$
net use * /delete /y
net use l: \\%1\c$ password /user:%1\administrator
if not exist L:\ (echo %1 failed mapping drive letter>>"%userprofile%\desktop\net use log.txt"& goto :EOF)
echo copying link file to C: Drive
copy "c:\_\CopyFileToHost\logoff.cmd" l:\
if not exist "L:\logoff.cmd" (echo %1 failed copying "c:\_\CopyFileToHost\logoff.cmd">>"%userprofile%\desktop\net use log.txt")
echo deleting l: mapping
net use l: /delete /y
goto :eof
:usage
echo Usage: %0 hostname
exit /B 1
答案 1 :(得分:1)
首先,不要使用
if [%1]==[] goto usage
因为方括号在这里没有任何特殊含义。更好的是使用
if "%~1"=="" goto usage
双引号字符具有特殊含义,因为它可以比较包含1个或多个空格或1个或多个字符&()[]{}^=;!'+,`~
的字符串。
%~1
表示删除了周围双引号的第一个参数。有关详细信息,请参阅命令提示符窗口call /?
中的帮助输出。
其次,请阅读有关Using command redirection operators和Testing for a Specific Error Level in Batch Files的Microsoft文章,以了解下面的批处理代码。
@echo off
if "%~1"=="" goto usage
%SystemRoot%\System32\net.exe use L: /delete /y 2>nul
(
echo Mapping L: to %~1\c$ ...
%SystemRoot%\System32\net.exe use L: "\\%~1\c$" password /user:%~1\administrator /persistent:no
if not errorlevel 1 (
echo Copying the file X ...
rem copy X L:\
echo Disconnecting network drive L: ...
%SystemRoot%\System32\net.exe use L: /delete /y
)
) >command.txt 2>&1
goto :EOF
:usage
echo Call this batch file with name of computer as parameter.
echo.
pause
写入 stderr 的错误消息被2>&1
附加到 stdout ,默认情况下会写入标准消息。写入 stdout 的所有内容都会重定向到当前目录中的文件command.txt
,因此文本文件包含正确输出顺序的标准和错误消息。
如果您希望同时写入文本文件的命令更容易确定哪个命令来自哪个错误或标准消息,echo
还可以添加命令。