在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
没有成功
答案 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
实例。
如果要在batch-file中使用代码,请确保将%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”提案