我需要将copy
命令的输出转发到WRITELOG
函数。无论如何要做到这一点?这就是我累了而不行的
copy /y %source% %destination%>WRITELOG
:WRITELOG
if not "%1"=="" (
echo %time% : %*>>%LOGFILE%
)
答案 0 :(得分:0)
Stephan的建议将编码为:
@echo off
setlocal EnableDelayedExpansion
set "source=%~1"
set "destination=%~2"
set "LOGFILE=%TEMP%\CopyLog.txt"
for /F "delims=" %%L in ('copy /Y "%source%" "%destination%" 2^>nul') do (
set "CopyOutput=%%L"
if not "!CopyOutput:copied=!" == "%%L" echo %time% : %*>>%LOGFILE%
)
endlocal
有关使用的命令如何工作的说明,请打开命令提示符窗口,按照以下命令运行并读取每个命令的帮助输出:
copy /?
for /?
if /?
set /?
但是,由于以下原因,此解决方案并不好:
copied
取决于命令语言复制。0 file(s) copied.
,由此解释代码作为成功的副本。使用以下方法可以避免第二个缺点:
@echo off
setlocal EnableDelayedExpansion
set "source=%~1"
set "destination=%~2"
set "LOGFILE=%TEMP%\CopyLog.txt"
for /F "tokens=1,3" %%A in ('copy /Y "%source%" "%destination%" 2^>nul') do (
echo %%A %%B
if not "%%A" == "0" (
if "%%B" == "copied." echo %time% : %*>>%LOGFILE%
)
)
endlocal
但更好的方法是评估命令复制的退出代码,成功时 0 ,错误时更大0。
@echo off
setlocal
set "source=%~1"
set "destination=%~2"
set "LOGFILE=%TEMP%\CopyLog.txt"
copy /Y "%source%" "%destination%" >nul 2>nul
if not errorlevel 1 echo %time% : %*>>%LOGFILE%
endlocal
请参阅Microsoft支持文章Testing for a Specific Error Level in Batch Files。
if not errorlevel 1
表示先前命令的退出代码不大于或等于1然后...
或者换句话说,如果前一个命令的退出代码小于1,那么......
命令复制永远不会像cmd.exe
的所有内部命令和几乎所有控制台应用程序一样以负值退出,因为 0 是成功的标准,值更大0表示错误。