如何将命令的输出转发为函数参数

时间:2015-07-26 05:47:56

标签: batch-file window command

我需要将copy命令的输出转发到WRITELOG函数。无论如何要做到这一点?这就是我累了而不行的

copy /y %source% %destination%>WRITELOG

:WRITELOG
if not "%1"=="" (
 echo %time% : %*>>%LOGFILE%
)

1 个答案:

答案 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 /?

但是,由于以下原因,此解决方案并不好:

  1. IF 条件中的字符串copied取决于命令语言复制
  2. 如果找到源中的文件,但由于目标处于写保护状态而无法复制到目标,则复制的输出为0 file(s) copied.,由此解释代码作为成功的副本。
  3. 使用以下方法可以避免第二个缺点:

    @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表示错误。