2013-06-12 93 views
4

我想定义一个DOSKEY宏,它将STDOUT和STDERR输出重定向到一个文件。 doskey将通过运行批处理文件来设置。我只能用下面对STDOUT做到这一点:在DOSKEY宏中重定向STDERR和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而不是>),但我已经完成了大量的使用google搜索,并且还没有找到任何东西。所以我向你提出我的同胞SOF的问题。

回答

1

我也曾经在网络上寻找解决方案,但没有运气。我能想出的最好需要添加2> & 1到您的宏的调用:

doskey logged_build=build $* $g build.log 

然后调用它是这样:

logged_build 2>&1 
1

你不能在命令直接执行此操作行,但你可以使用doskey宏分析。 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选项到cmd.exe在向用户提供交互式提示之前,将在shell中运行后续命令。如果您的提示自动定义所有宏而不必每次都设置它们,则可以节省很多麻烦。

或者,为避免需要修改单个快捷方式,可以设置一个注册表项,无论如何加载宏,即使直接调用cmd.exe,也不需要经过修改的快捷方式。只要运行:

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

您可以更改HKCUHKLM,使之在全球范围适用于所有用户,而不仅仅是自己,虽然在这种情况下你会想要把宏文件在一个共同的位置,而不是你的用户个人资料。令人烦恼的是,对于这种情况,您不能使用REG_EXPAND_SZ(这样可以使用像%USERPROFILE%这样的变量将全局HKLM设置为相对于每个用户的配置文件目录的文件,或处理配置文件被重定位的情况),但它工作得很好。

相关问题