Windowsbatch file中的variables行为

当涉及到与Windows有关的任何事情时,我都是一个完整的noob,所以我希望这对某个人来说是一个简单的问题。 我使用Win7,如果它有所作为。

我有一个.cmd文件中的下面的代码,我从命令行连续运行两次,产生以下输出:

set /p input_tmp=input something: || set input_tmp=default echo "input_tmp outside if: %input_tmp%" if "%input_tmp%"=="default" ( echo "input_tmp inside if: %input_tmp%" ) -------------output 1--------------- input something: cat "input_tmp outside if: cat" -------------output 2--------------- input something: dog "input_tmp outside if: dog" 

但是,当我运行下面的代码…

 if not "%~1"=="something" ( set /p input_tmp=input something: || set input_tmp=default echo "input_tmp outside if: %input_tmp%" if "%input_tmp%"=="default" ( echo "input_tmp inside if: %input_tmp%" ) ) -------------output 1--------------- input something: cat -------------output 2--------------- input something: dog "input_tmp outside if: cat" 

作为一个Linux的Java程序员…这混淆了我的烦恼。

在批处理文件中,当代码块(括号内的代码)到达时,所有的块都被解析,并且开始执行代码之前 ,所有的变量读取都被替换为变量中存储的值。 如果块中的代码更改了变量中的值,则无法从同一块内部检索此值,因为读取操作不存在,所以将其替换为变量中的值。

为了避免这种情况,必须/应该使用延迟扩展。 这可以在必要时更改语法%var% to !var! ,向解析器指示对变量的读取操作必须延迟直到执行该命令。

 setlocal enabledelayedexpansion if not "%~1"=="something" ( set /p input_tmp=input something: || set input_tmp=default echo "input_tmp outside if: !input_tmp!" if "!input_tmp!"=="default" ( echo "input_tmp inside if: !input_tmp!" ) )