Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 无法将用户输入值回送到批处理脚本中的文件_Windows_Cmd_Batch File - Fatal编程技术网

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命令一起使用?没有必要,请看我的答案,谢谢阅读。