pie*_*bie 12 windows batch-file
当我尝试SHIFT在IF块内部使用时,我看到了一些意想不到的结果.使用这个:
@echo off
if "%1"=="/p" (
echo %1
shift
echo "shifted"
echo %1
)
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
C:\>ex.bat /p HAI
/p
"shifted"
/p
Run Code Online (Sandbox Code Playgroud)
但是,当我使用此代码时:
@echo off
echo %1
shift
echo "shifted"
echo %1
Run Code Online (Sandbox Code Playgroud)
我明白了:
C:\>ex.bat /p HAI
/p
"shifted"
HAI
Run Code Online (Sandbox Code Playgroud)
我需要第二个输出,但是在逻辑块中我可以循环它.我试图在这里实现类似Jon的答案:在DOS命令行中使用批处理文件中的参数,但是我遇到了一些麻烦.为什么会这样?
dbe*_*ham 12
这是预期的行为,因为%1在解析行时会扩展,并且在一次传递中解析整个带括号的IF构造.因此,在解析新行之前,您无法看到SHIFT的结果,这在您离开括号内的块之后才会发生.
使用扩展环境变量时会发生同样的问题%var%.使用环境变量,您可以通过使用SETLOCAL EnableDelayedExpansion然后使用延迟扩展来解决问题!var!.但是没有任何类似的方法可以使用延迟扩展来扩展参数.
编辑2013-06-21 - 没有类似的方法,但有一种相对缓慢的简单方法.
您可以通过使用CALL强制重新排序该行并将其加倍%.
@echo off
if "%1"=="/p" (
echo %1
shift
echo "shifted"
call echo %%1
)
Run Code Online (Sandbox Code Playgroud)
编辑2016-07-15 弗拉迪斯拉夫答案中
的代码是一个不好的做法,因为它意味着你可以在使用GOTO离开之后跳回一段代码.这根本行不通.GOTO立即杀死任何已解析的代码块.您也可以将Vladislav的代码写成:
@echo off
if "%1"=="/p" (
goto :true
:true
echo "%1"
shift
echo shifted
echo "%1"
)
Run Code Online (Sandbox Code Playgroud)
如果条件为FALSE,则跳过整个块.如果条件为TRUE,则GOTO立即终止块,然后执行通常在:true标签(没有块上下文).最后的额外内容)被忽略了.
请注意,您无法使用此构造添加ELSE.以下内容未给出所需结果:
@echo off
if "%1"=="/p" (
goto :true
:true
echo "%1"
shift
echo shifted
echo "%1"
) else (
echo This will execute regardless whether arg1 is /p or not
)
Run Code Online (Sandbox Code Playgroud)
如果为FALSE,则仅执行ELSE块.如果为TRUE,则执行顶部块并立即终止.执行代码的其余部分,并且) else (忽略该行,因为)如果解析器期望命令并且堆栈上没有活动的括号块,则将其用作REM.
我强烈建议您不要像我上面所示(或者像Vladislav所做的那样)在带括号的代码块中输入标签.
下面是一个更好(更简单,而不是误导)的方法来做同样的事情:
@echo off
if not "%1"=="/p" goto :skip
echo "%1"
shift
echo shifted
echo "%1"
:skip
Run Code Online (Sandbox Code Playgroud)
您可以使用一些额外的标签和GOTO来支持IF/THEN/ELSE概念
@echo off
if not "%1"=="/p" goto :notP
echo "%1"
shift
echo shifted
echo "%1"
goto :endIf
:notP
echo not /p
:endIf
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2714 次 |
| 最近记录: |