5

我正在尝试定义一个将 STDOUT 和 STDERR 输出重定向到文件的 DOSKEY 宏。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 而不是 >)的问题,但是我已经进行了大量的谷歌搜索,但还没有找到任何东西。所以我向你们我的 SOF 同胞提出这个问题。

4

2 回答 2

3

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

在任何你喜欢的地方创建一个文件(例如%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

并单击快捷方式将创建一个预先加载所有宏的命令提示符。在向用户提供交互式提示之前在 shell 中运行后续命令的/K选项。cmd.exe如果您的提示自动定义所有宏,而不必每次都设置它们,则可以节省很多麻烦。

或者,为了避免需要修改单个快捷方式,您可以设置一个注册表项,该注册表项无论如何都会加载宏,即使cmd.exe直接调用,也无需通过修改后的快捷方式。赶紧跑:

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

您可以更改HKCUHKLM使其适用于所有用户,而不仅仅是您自己,但在这种情况下,您希望将宏文件放在一个公共位置,而不是您的用户配置文件中。令人讨厌的是,您不能使用 a REG_EXPAND_SZfor 这样的情况(这将允许您使用变量,例如为与每个用户的配置文件目录相关的文件%USERPROFILE%设置全局设置,或处理配置文件被重新定位的情况),但它运作良好HKLM足够的。

于 2016-02-18T18:46:01.073 回答
1

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

doskey logged_build=build $* $g build.log

然后像这样调用它:

logged_build 2>&1
于 2013-06-12T21:44:09.023 回答