我想从stdin读取我需要创建的批处理文件的文件名。全部在一条线上并使用管道。 当我尝试cmd时,在我输入名称之前创建.bat。
set /p filename= | copy NUL %a%.bat
答案 0 :(得分:4)
这不是管道的工作方式。管道获取上一个命令的输出,并使其成为下一个命令的输入。您的set /p filename=
命令不会产生任何输出,因此copy NUL %a%.bat
不会获得任何输入,但无论如何这都是无关紧要的,因为copy
命令无论如何都不会输入任何输入。您的copy NUL %a%.bat
命令会创建一个名为.bat的空文件,因为您尚未定义名为a
的变量,因此%a%
会扩展为空字符串。
您想要做的事情需要两个命令:
set /p filename=
copy NUL %filename%.bat
答案 1 :(得分:2)
补充Klitos Kyriacou's helpful answer:
管道绝对不是正确的选择,但&
和&&
原则上可用于在单行上执行多个命令,所以你可能诱惑来做以下事情:
:: !! WRONG
set /p filename="" && copy NUL "%filename%.bat"
问题是变量引用%filename%
在执行命令行之前已扩展。 [1]
但是,如果您打开延迟扩展(通过cmd /V
,或者在带有setlocal enabledelayedexpansion
的批处理文件中(这也使所有变量都是本地的)),您<假设您使用!...!
来引用变量,em>可以使这项工作成功:
:: OK, assuming delayed expansion is on.
set /p filename="" && copy NUL "!filename!.bat"
[1] Magoo's answer通过技巧解决该问题:call
有效延迟扩展,但这需要%filename%
不预先展开,这就是%%
加倍导致文字 %
字符的原因:%%filename%%
最初是 扩展为 literal %filename%
,然后由call
解释为变量引用 - 此时变量已经具有值。
自%
字符开始。无法在命令行上进行转义,需要采用不同的方法:%filename^%
达到与上述相同的效果。
答案 2 :(得分:2)
作为批处理文件中的一行,请使用
Assign()
如果您在提示时输入此内容,请将SET /p "filename=Filename ? "&CALL COPY NUL %%filename%% >nul
缩减为%%
请注意,%
会抑制>nul
消息。