Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
Batch file 在if块中,批处理文件输入无法正常工作_Batch File - Fatal编程技术网

Batch file 在if块中,批处理文件输入无法正常工作

Batch file 在if块中,批处理文件输入无法正常工作,batch-file,Batch File,在该if块内使用set/p时。变量input未设置为输入值。它仅在第二次调用脚本时设置(好像它仅在echo%input%line之后设置) 如何将变量输入设置为实际输入的值?您需要使用延迟扩展 在批处理语言中,在FOR或IF中,变量在命令执行之前“展开”,而不是在命令执行期间展开。(展开=变量由其值重新放置) 例如,下面的IF测试 IF condition ( foo bar ) 如果条件foo&bar 因此,如果在foo中设置了一个变量,并且在bar中使用了相同的变量,则在bar中使用的是该

在该if块内使用
set/p
时。变量
input
未设置为输入值。它仅在第二次调用脚本时设置(好像它仅在
echo%input%
line之后设置)


如何将变量
输入设置为实际输入的值?

您需要使用延迟扩展

在批处理语言中,在FOR或IF中,变量在命令执行之前“展开”,而不是在命令执行期间展开。(展开=变量由其值重新放置)

例如,下面的IF测试

IF condition (
foo
bar
)
如果条件foo&bar

因此,如果在
foo
中设置了一个变量,并且在bar中使用了相同的变量,则在
bar
中使用的是该变量的上一个值(进入循环之前的值)

这有点令人不安,但批处理的工作方式。。。 因此,设置是正确的,这只是一种特殊的工作方式

您必须在代码的开头写入
SETLOCAL ENABLEDELAYEDEXPANSION
,并且应该延迟扩展的变量必须被
包围而不是
%


所以
echo%input%
变成
echo!输入

您需要使用延迟扩展

在批处理语言中,在FOR或IF中,变量在命令执行之前“展开”,而不是在命令执行期间展开。(展开=变量由其值重新放置)

例如,下面的IF测试

IF condition (
foo
bar
)
如果条件foo&bar

因此,如果在
foo
中设置了一个变量,并且在bar中使用了相同的变量,则在
bar
中使用的是该变量的上一个值(进入循环之前的值)

这有点令人不安,但批处理的工作方式。。。 因此,设置是正确的,这只是一种特殊的工作方式

您必须在代码的开头写入
SETLOCAL ENABLEDELAYEDEXPANSION
,并且应该延迟扩展的变量必须被
包围而不是
%


所以
echo%input%
变成
echo!输入

此处不需要
延迟扩展。例如:

 if "%1"=="" (
        echo "You have to specify the name of the file."
        set /p input=File name: 
        call echo %%input%%
        pause

 ) else (
        ...
 )

这里不需要
延迟扩展。例如:

 if "%1"=="" (
        echo "You have to specify the name of the file."
        set /p input=File name: 
        call echo %%input%%
        pause

 ) else (
        ...
 )

没错,我同意朱利安的看法。如果启用延迟扩展,则SET/P将在for块内工作。@djangofan-实际上,SET/P无论如何都能工作。只有存储值的显示需要延迟扩展。
如果条件foo&bar
应写入
如果条件foo&bar
。正如最初使用
&&
编写的那样,
bar
仅在
foo
成功时才会执行
| |
是失败的条件运算符。简单的命令连接操作符是一个
&
。没错,我同意Julien的观点。如果启用延迟扩展,则SET/P将在for块内工作。@djangofan-实际上,SET/P无论如何都能工作。只有存储值的显示需要延迟扩展。
如果条件foo&bar
应写入
如果条件foo&bar
。正如最初使用
&&
编写的那样,
bar
仅在
foo
成功时才会执行
| |
是失败的条件运算符。简单命令串联运算符是单个
&