【问题标题】:Redirecting STDERR and STDOUT in a DOSKEY macro在 DOSKEY 宏中重定向 STDERR 和 STDOUT
【发布时间】:2013-06-12 20:25:23
【问题描述】:

我正在尝试定义一个将 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 同胞提出这个问题。

【问题讨论】:

  • 来到这里寻找简单的标准输出重定向并找到您提供的 $g 。谢谢你的例子! :-)

标签: redirect stdout dos stderr doskey


【解决方案1】:

您不能直接在命令行中执行此操作,但您可以使用doskey 宏文件执行此操作。宏文件甚至不需要使用confusing magic like $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

并单击快捷方式将创建一个预先加载所有宏的命令提示符。 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_EXPAND_SZ(这将允许您使用%USERPROFILE% 之类的变量将全局HKLM 设置为与每个用户的配置文件目录相关的文件,或处理配置文件被重新定位),但它工作得很好。

【讨论】:

    【解决方案2】:

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

    doskey logged_build=build $* $g build.log
    

    然后这样调用它:

    logged_build 2>&1
    

    【讨论】:

      猜你喜欢
      • 2014-07-22
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多