【问题标题】:Why is my piping failing?为什么我的管道失败了?
【发布时间】:2014-02-01 01:55:26
【问题描述】:

我一直在搞乱 .cmd 脚本,并想练习管道。我写了一个脚本来制作文件,另一个用 Notepad++ 编辑它们。制作脚本(名为create.cmd)如下:

@echo off
copy nul %1 > nul
echo %1

而编辑脚本(称为edit.cmd)如下:

@echo off
start notepad++.exe %1

现在,我想尝试创建一个文件,然后以文件名的形式将其输出(因此是 echo 行)传送到编辑脚本。所以我写的是这样的:

create foo.txt | edit

但是,这失败了 - 我打开了 Notepad++ 窗口,但我新创建的文件没有出现在那里。我在这里错过了什么或做错了什么?

【问题讨论】:

    标签: windows scripting cmd pipe


    【解决方案1】:

    您没有从第二个批处理文件中的管道读取数据。

    对于从第一批中仅读取一行输出,文件名,这应该足够了:

    @echo off
    set /p file=
    start notepad.exe %file%
    

    否则检查Read stdin stream in a batch file 以读取多行输入。

    【讨论】:

    • 非常感谢!完美解决了。出于兴趣, /p 对脚本中 set 声明的变量有什么作用?
    • /p 开关告诉set 将变量设置为从标准输入读取的行。在提示符中输入help set,它记录在那里。
    • 谢谢。但是,我发现具有此解决方案的脚本不再需要正常参数!例如,如果我尝试edit foo.txt 之类的东西,它会再次要求输入!如果我不使用管道,有什么方法可以默认为“正常”参数,如果我是,你的解决方案是什么?
    • 我建议您将此作为新问题提交。然而,在 unix 上,- 参数表示标准输入是很常见的。所以你会说tar foo.txttar - 并且tar 命令会知道在第二种情况下它需要从标准输入而不是文件中读取。您可以检查 %1,然后决定是 set /p 还是将其视为文件。
    【解决方案2】:

    edit.bat 没有%1 参数

    你可以试试这个:

    @echo off
    copy nul %1 > nul
    echo %1
    call edit %1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      相关资源
      最近更新 更多