无法回应用户的输入值在批处理脚本

问题描述:

我写一个批处理文件,将生成/写入基于多个用户输入值的属性文件到文件。但是,它不记录输入的值。结果看起来像无法回应用户的输入值在批处理脚本

prop1= 
prop2= 

我不知道是否有什么我需要知道与被阻止了这种工作集。

奇怪的是,如果我运行这个特定脚本多次,从回声输出值似乎永远是从最后一次的用户输入。

代码:当行被解析

@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 
) 
+0

你为什么用这两个回声命令?没有必要,看到我的答案,谢谢你的阅读。 – ElektroStudios

经典问题对于没有经验的批量化:)

%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)使用延迟扩展消除包围括号 - 所发生只是括号内的每一行执行

@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 
) 
+0

不知道goto在这里有很大的不同。 setlocal做什么? – ttback

+0

尝试了第一个解决方案,第二个解决方案不起作用。如果我从另一个文件调用这个批处理脚本文件,出于某种原因输出到文件后它不会执行任何操作。例如,如果这是script.bat,我们有一个包含“呼叫script.bat”和一堆批处理脚本的file.bat,它只会调用script.bat和停在那里。我必须再次调用file.bat才能运行其余的bat命令....为什么会这样? – ttback

+0

@ttback - SETLOCAL的主要功能是本地化改变环境变量。在发布ENDLOCAL后,旧值将被恢复。但在这种情况下,它被用来获取延迟扩展功能。从命令提示符输入'HELP SETLOCAL'以获得更多信息。有关正常扩张的循环中存在的问题,键入'HELP SET'并阅读了*“最后,对于延迟的环境变量扩展支持已被添加...” *(1/2左右一路下跌)开头的部分更多信息 – dbenham

你之前需要使用SETLOCAL ENABLEDELAYEDEXPANSION或使用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 

)