如何将命令行指令本身转储到输出文件中?

时间:2019-07-16 13:35:30

标签: windows file cmd output io-redirection

在Windows命令行中,我想将命令行指令直接转储到输出文件中 例如,如果我执行:

dir "C:\Program Files\*.exe" /B /S /O:GNE > "ExeList PgmFiles.txt"

我要在输出文件“ ExeList PgmFiles.txt”中将第一行与命令行指令本身一起(以跟踪实际执行的内容),因此在此示例中:

dir "C:\Program Files\*.exe" /B /S /O:GNE > "ExeList PgmFiles.txt"

然后文件将获得实际的执行输出。 我尝试过:

dir "C:\Program Files\*.exe" /B /S /O:GNE 1 > "ExeList PgmFiles.txt" 0>&1

没有成功

3 个答案:

答案 0 :(得分:2)

您可以通过以下方式获得此结果:将命令分配给变量,然后将变量回显到文件中,然后执行变量并将输出附加到同一文件中。

包含所有传递的参数的变量为%*。 让我们将其放入批处理文件“ doit.bat”中:

@echo off
echo %*
%*

您现在可以像这样在命令前添加“ doit.bat”:

doit dir "C:\Program Files\*.exe" /B /S /O:GNE > "ExeList PgmFiles.txt"

答案 1 :(得分:1)

1>0>&1中的数字具有以下含义(请咨询文章Redirection以了解更多信息):

  • 句柄0指向 STDIN ,即控制台或键盘输入
  • 句柄1指向 STDOUT ,即控制台或显示输出
  • 句柄2指向 STDERR ,即错误显示输出

因此,您无法重定向0 STDIN )来将执行的命令行写入重定向目标。

一种可能的方法是简单地预先echo命令行,escape任何特殊字符,然后重定向到同一目标文件,如下所示(请注意转义序列^>):

echo dir "C:\Program Files\*.exe" /B /S /O:GNE ^> "ExeList PgmFiles.txt" > "ExeList PgmFiles.txt" 
dir "C:\Program Files\*.exe" /B /S /O:GNE >> "ExeList PgmFiles.txt"

但是您可能会认为这不太优雅。

一种替代方法是使用命令回显,当环绕for loop仅循环一次时,可以将其与命令输出一起重定向,如下所示:

(for %Z in (.) do dir "C:\Program Files\*.exe" /B /S /O:GNE) > "ExeList PgmFiles.txt"

当然必须启用命令回显(例如,通过键入@echo on),因此必须不使用/Q选项启动托管cmd.exe实例。

如果要在中使用代码,请确保将%Z更改为%%Z

答案 2 :(得分:-1)

谢谢 @neuhaus 我在文件夹“ track”中创建了一个具有以下内容的dosit.bat文件:

    CHCP 65001
    set log=e:\track\dositOUT.txt
    set error=e:\track\dositERR.txt 
    echo %COMPUTERNAME% %date% %time% >> %log% 
    echo %COMPUTERNAME% %date% %time% >> %error%
    @echo off
    echo %*
    %*

然后我从e:\ track执行(非管理员)

dosit dir "e:\data\*.xls" /B /S 1>> %cd%\dositOUT.txt 2>> %cd%\dositERR.txt

近乎完美,但与cmd相反

dir "e:\data\*.xls" /B /S 1> %cd%\dositOUT.txt 2> %cd%\dositERR.txt

以某种方式执行bat文件,但我没有utf8编码,并且非英语(amééèçà...)字符看起来很奇怪(éÃ... ...),并且执行bat时dositERR.txt转储了2个权限错误,我认为与CHCP 65001有关。 任何想法? 操作系统:赢得10个64位元版本1903

我刚刚发现我首先需要执行CHCP 65001,然后执行:

dosit WHATEVER_DOS_CMD 1>> %cd%\dositOUT.txt 2>> %cd%\dositERR.txt

@aschipfl “但是你可能会同意这不是很优雅。” 的确,这就是为什么我喜欢“ neuhaus”提案