Windows 无法将用户输入值回送到批处理脚本中的文件
我正在编写一个批处理文件,该批处理文件将基于多个用户输入值生成/写入属性文件。但是,它不记录输入值。结果看起来像Windows 无法将用户输入值回送到批处理脚本中的文件,windows,cmd,batch-file,Windows,Cmd,Batch File,我正在编写一个批处理文件,该批处理文件将基于多个用户输入值生成/写入属性文件。但是,它不记录输入值。结果看起来像 prop1= prop2= 我想知道set是否有什么让我无法工作的地方 奇怪的是,如果我多次运行这个特定的脚本,echo输出的值似乎总是上次的用户输入 代码: @echo off IF NOT EXIST data_file ( set /p prop1=Enter value: set /p prop2=Enter value: (echo prop1=%prop1%) &
prop1=
prop2=
我想知道set是否有什么让我无法工作的地方
奇怪的是,如果我多次运行这个特定的脚本,echo输出的值似乎总是上次的用户输入
代码:
@echo off
IF NOT EXIST data_file (
set /p prop1=Enter value:
set /p prop2=Enter value:
(echo prop1=%prop1%) > data_file
(echo prop2=%prop2%) >> data_file
)
经验不足的批处理程序的典型问题:) 分析行时,
%prop1%
将展开。您的问题是括号内的所有内容都在一次传递中解析。因此,您看到的值是在您输入IF语句之前存在的值
您有两个简单的解决方案
1) 通过反转逻辑并使用GOTO消除封闭参数
@echo off
IF EXIST file goto skip
set /p prop1=Enter value:
set /p prop2=Enter value:
(echo prop1=%prop1%) >file
(echo prop2=%prop2%) >>file
:skip
2) 使用延迟扩展-在执行parens中的每一行之前发生
@echo off
setlocal enableDelayedExpansion
IF NOT EXIST file (
set /p prop1=Enter value:
set /p prop2=Enter value:
(echo prop1=!prop1!)>file
(echo prop2=!prop2!)>>file
)
您需要使用SETLOCAL ENABLEDELAYEDEXPANSION或use CALL展开变量
@echo off
IF NOT EXIST data_file (
set /p prop1=Enter value:
set /p prop2=Enter value:
(
Call echo prop1=%%prop1%%
Call echo prop2=%%prop2%%
) > data_file
)
我不知道后藤在这里有很大的不同。setlocal做什么?尝试了第一个解决方案,第二个解决方案无效。如果我从另一个文件调用此批处理脚本文件,出于某种原因,它在输出到该文件后不会执行任何操作。例如,如果这是script.bat,我们有一个包含“call script.bat”和一堆批处理脚本的文件.bat,它将只调用script.bat并停在那里。我必须再次调用file.bat才能运行其余的bat命令……为什么?@ttback-SETLOCAL的主要功能是本地化对环境变量的更改。旧值将在发出ENDLOCAL时恢复。但在这种情况下,它被用来访问延迟扩展功能。在命令提示符下键入
HELP SETLOCAL
,以获取更多信息。有关循环内正常扩展问题的更多信息,请键入HELP SET
,并阅读以“最后,添加了对延迟环境变量扩展的支持…”(大约向下1/2)@ttback-Oops开头的部分。我在第二个选项中的重定向出现了一个愚蠢的错误。已经修好了。关于wny,你的脚本没有继续,我不知道为什么没有看到你的代码。也许作为一个新问题?明天将不得不添加一个新问题。现在在办公室里已经很累了。出发。不过非常感谢您的帮助。为什么要将agruptions与两个echo命令一起使用?没有必要,请看我的答案,谢谢阅读。