当谈到与Windows相关的任何内容时,我都是一个完整的菜鸟,所以我希望这对某人来说是一个简单的问题。如果它有所作为,我正在使用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程序员......这让我感到困惑。
答案 0 :(得分:2)
在批处理文件中,当到达代码块(括号内的代码)时,将解析所有块,并将所有变量读取替换为存储在变量中的值开始执行之前代码。如果块中的代码更改了变量中的值,则无法从同一块内部检索此值,因为读取操作不存在,它将替换为变量中的值。
为避免这种情况,必须/应该使用延迟扩展。这允许在必要时将语法%var%
更改为!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!"
)
)