【问题标题】:How to forward output of a command as function argument如何将命令的输出作为函数参数转发
【发布时间】:2015-07-26 05:47:55
【问题描述】:

我需要将copy 命令的输出转发到WRITELOG 函数。有没有办法做到这一点?这是我累了不工作的地方

copy /y %source% %destination%>WRITELOG

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

【问题讨论】:

  • 重定向 (>) 用于重定向到文件(或设备)。您将在函数中使用该文件或使用 for /f 将命令的输出捕获到变量中并将其与 call 一起使用(仅适用于单行输出)

标签: batch-file window command


【解决方案1】:

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 取决于命令语言copy
  2. 如果找到源中的文件,但由于目标受写保护而无法复制到目标,则 copy 的输出为 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

但更好的是评估命令 copy 的退出代码,成功时为 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 则 ...

命令 copy 永远不会像 cmd.exe 的所有内部命令和几乎所有控制台应用程序一样以负值退出,因为 0 是成功的标准,大于 0 的值是错误指示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 2015-04-09
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2021-12-06
    相关资源
    最近更新 更多