我正在尝试定义一个DOSKEY宏,它将STDOUT和STDERR输出重定向到一个文件。将通过运行批处理文件来设置doskey。我只能通过以下方式为STDOUT执行此操作:
doskey logged_build=build $g build.log
但是,我不能使用典型的2>& 1选项(如下所示)将STDERR输出重定向到同一个文件。
doskey logged_build=build $g build.log 2>&1
我也试过
doskey logged_build=build $g build.log 2$g&1
,它给出了语法错误和
doskey logged_build=build $g build.log 2$g build.log
,它给出了一个错误,即由于另一个进程正在使用该文件而无法访问该文件。
我确信这只是使用正确的宏通配符(比如使用$ g而不是>),但我已经完成了大量的谷歌搜索,但还没有找到任何东西。所以我向你们的SOFers提出了问题。
答案 0 :(得分:2)
您不能直接在命令行执行此操作,但可以使用doskey
macrofile执行此操作。 Macrofiles甚至不需要使用confusing magic like $g
;它们不是shell的一部分,因此shell特殊字符可以正常使用,并且包含在宏的定义中,而不是在定义宏之前由shell解释。
随时随地创建文件(例如%USERPROFILE%\mymacros.txt
),并在其中添加以下内容:
logged_build=build >build.log 2>&1
然后运行:
加载宏doskey /MACROFILE=%USERPROFILE%\mymacros.txt
您可以在文件中放入许多宏来同时加载它们;这样一般也可以轻松自定义命令提示符;您可以修改现有的Command Prompt
快捷方式,也可以根据cmd.exe
创建新的快捷方式,以制作Target
:
%windir%\system32\cmd.exe /K doskey /MACROFILE=%USERPROFILE%\mymacros.txt
并单击该快捷方式将创建一个预加载了所有宏的命令提示符。在向用户提供交互式提示之前,/K
的{{1}}选项会在shell中运行后续命令。如果您的提示自动定义所有宏而无需每次都进行设置,则可以省去很多麻烦。
或者,为了避免需要修改单个快捷方式,您可以设置一个注册表项,无论如何都会加载宏,即使直接调用cmd.exe
,也无需通过修改后的快捷方式。跑吧:
cmd.exe
您可以将reg add "HKCU\Software\Microsoft\Command Processor" /v AutoRun /t REG_SZ /d "doskey /MACROFILE=%USERPROFILE%\mymacros.txt"
更改为HKCU
,使其全局适用于所有用户,而不仅仅是您自己,但在这种情况下,您希望将宏文件放在公共位置,而不是您的用户资料。令人讨厌的是,你不能使用HKLM
这样的情况(允许你使用REG_EXPAND_SZ
之类的变量来设置相对于每个用户的配置文件目录的文件的全局%USERPROFILE%
设置,或处理配置文件被重新定位的情况),但它运作良好。
答案 1 :(得分:1)
我也曾在网上找到一个没有运气的解决方案。我可以提出的最好的方法是将2>& 1添加到宏的调用中:
doskey logged_build=build $* $g build.log
然后按原样调用它:
logged_build 2>&1