Redirect 在DOSKEY宏中重定向STDERR和STDOUT

Redirect 在DOSKEY宏中重定向STDERR和STDOUT,redirect,stdout,dos,stderr,doskey,Redirect,Stdout,Dos,Stderr,Doskey,我试图定义一个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

我试图定义一个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而不是>)的问题,但我已经在谷歌上搜索了很多次,还没有找到任何东西。所以我向你们提出了这个问题,我的同胞们。

我也曾在网络上寻找解决方案,但运气不佳。我所能想到的最好方法是将2>&1添加到宏的调用中:

doskey logged_build=build $* $g build.log
然后按如下方式调用它:

logged_build 2>&1

您不能直接在命令行执行此操作,但可以使用
doskey
宏文件执行此操作。宏文件甚至不需要使用;它们不是shell的一部分,因此可以正常使用shell特殊字符,并包含在宏的定义中,而不是在定义宏之前由shell进行解释

在您喜欢的任何地方创建一个文件(例如
%USERPROFILE%\mymacros.txt
),并在其中放入以下行:

logged_build=build >build.log 2>&1
然后通过运行以下命令加载宏:

doskey /MACROFILE=%USERPROFILE%\mymacros.txt
您可以在文件中放置多个宏,以便同时加载所有宏;这也使得定制命令提示符变得简单;您可以修改现有的
命令提示符
快捷方式,或者基于
cmd.exe
创建一个新的快捷方式,以使
目标

%windir%\system32\cmd.exe /K doskey /MACROFILE=%USERPROFILE%\mymacros.txt
单击快捷方式将创建一个命令提示符,其中预加载了所有宏。
cmd.exe
/K
选项在给用户一个交互式提示之前在shell中运行后续命令。如果提示自动定义所有宏而无需每次设置宏,则可以节省大量麻烦

或者,为了避免需要修改单个快捷方式,您可以设置一个注册表项,该注册表项将在任何情况下加载宏,即使直接调用
cmd.exe
,也不必通过修改后的快捷方式。只需运行:

reg add "HKCU\Software\Microsoft\Command Processor" /v AutoRun /t REG_SZ /d "doskey /MACROFILE=%USERPROFILE%\mymacros.txt"

您可以将
HKCU
更改为
HKLM
,使其适用于所有用户,而不仅仅是您自己,尽管在这种情况下,您希望将宏文件放在公共位置,而不是您的用户配置文件中。令人恼火的是,对于这种情况,您不能使用
REG\u EXPAND\u SZ
(这将允许您使用
%USERPROFILE%
等变量来设置相对于每个用户的配置文件目录的文件的全局
HKLM
设置,或者处理配置文件被重新定位的情况),但是它工作得很好。

来这里寻找简单的stdout重定向,找到了您提供的$g。谢谢你的例子!:-)