使用管道创建用户定义的文件名批处理文件

时间:2016-02-08 00:20:12

标签: shell batch-file cmd pipe

我想从stdin读取我需要创建的批处理文件的文件名。全部在一条线上并使用管道。 当我尝试cmd时,在我输入名称之前创建.bat。

set /p filename= | copy NUL %a%.bat

3 个答案:

答案 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消息。