Batch file 如何从批处理中的变量写入文件名

Batch file 如何从批处理中的变量写入文件名,batch-file,cmd,Batch File,Cmd,我需要使用变量的值创建一个扩展名为.bat的新文件 例如,我键入“apple”,然后脚本应该创建一个名为apple.bat的文件。 我相信剧本应该是 set /p nume=Type the name | fsutil file createnew %nume%.bat 100 但是结果是“%nume%.bat”而不是“apple.bat”@SomethingDark的注释包含关键指针:fsutil命令必须位于单独的一行,才能访问新分配的%nume%变量 除此之外,您应该使用&(无条件)或&&

我需要使用变量的值创建一个扩展名为.bat的新文件

例如,我键入“apple”,然后脚本应该创建一个名为apple.bat的文件。 我相信剧本应该是

set /p nume=Type the name | fsutil file createnew %nume%.bat 100

但是结果是“%nume%.bat”而不是“apple.bat”

@SomethingDark的注释包含关键指针:
fsutil
命令必须位于单独的一行,才能访问新分配的
%nume%
变量

除此之外,您应该使用
&
(无条件)或
&&
(仅当左侧的命令成功时)来链接命令
|
(管道)仅在希望左侧命令的输出用作右侧命令的输入时才有意义。这在这里不适用,因为
set
命令不产生输出

因此,请使用以下方法:

set /p name="Type a name: "
fsutil file createnew "%name%.bat" 100
请注意,我是如何双引号引用整个文件名表达式的,以确保它能够正确处理带有嵌入空格的名称的

这两个命令必须在单独的行上的原因是,Windows命令处理器
cmd.exe
,在执行命令之前展开所有
%%
变量引用。
也就是说,
%name%
扩展到变量
name
在使用
set
提示输入值之前所具有的任何值;如果尚未设置该变量,将在命令提示下打印literal
%name%
;相反,在批处理文件中,变量引用将扩展为空字符串

但是,有一种方法可以改变这种行为:如果启用延迟扩展,则可以使用
变量引用的扩展延迟,即在访问时发生扩展

  • 以交互方式,您可以通过使用选项
    /V:on
    启动新的
    cmd.exe
    实例来启用此功能
  • 在批处理文件中,使用
    setlocalenabledelayedexpansion
    ;请注意,
    setlocal
    为您的变量创建了一个脚本本地范围,但这通常是可取的

去掉
|
并将
fsutil文件createnew%nume%.bat 100
放在另一行。@somethingsdark:谢谢你的提示;我已经更新了答案。通常建议对包含空格的字符串/变量引用进行双引号引用。也就是说,无论您是否双引号引用
set/p
的提示字符串,都不会影响用户输入的值,因此也不会影响存储的值。
cmd.exe /V:ON  # start a new cmd.exe instance with delayed expansion enabled
set /p name="Type a name: " && fsutil file createnew "!name!.bat" 100