gpt4 book ai didi

Windows 批量转移在 if block 中不起作用

转载 作者:可可西里 更新时间:2023-11-01 12:35:12 25 4
gpt4 key购买 nike

当我尝试在 IF block 中使用 SHIFT 时,我看到了一些意想不到的结果。使用这个:

@echo off

if "%1"=="/p" (
echo %1
shift
echo "shifted"
echo %1
)

我得到以下信息:

C:\>ex.bat /p HAI
/p
"shifted"
/p

但是,当我使用这段代码时:

@echo off

echo %1
shift
echo "shifted"
echo %1

我明白了:

C:\>ex.bat /p HAI
/p
"shifted"
HAI

我需要第二个输出,但在一个逻辑 block 中,这样我就可以遍历它。我正在尝试实现类似于 Jon 在这里的回答:Using parameters in batch files at DOS command line ,但我遇到了一些麻烦。为什么会这样?

最佳答案

这是预期的行为,因为 %1 在解析该行时被扩展,并且整个带括号的 IF 结构被一次性解析。因此,在解析新行之前您无法看到 SHIFT 的结果,而在您离开带括号的 block 之后才会发生这种情况。

使用 %var% 扩展环境变量时会发生同样的问题。使用环境变量,您可以通过使用 SETLOCAL EnableDelayedExpansion 启用延迟扩展然后使用 !var! 来解决这个问题。但是没有任何类似的方法可以使用延迟扩展来扩展参数。

EDIT 2013-06-21 - 没有可比较的方法,但有一种相对较慢的简单方法。

您可以通过使用 CALL 并将 % 加倍来强制重新解析该行。

@echo off

if "%1"=="/p" (
echo %1
shift
echo "shifted"
call echo %%1
)



编辑 2016-07-15code in Vladislav's answer是一种不好的做法,因为它意味着您可以在使用 GOTO 离开代码块后跳回代码块。那根本行不通。 GOTO 立即终止任何已解析的代码块。您不妨将 Vladislav 的代码编写为:

@echo off
if "%1"=="/p" (
goto :true
:true
echo "%1"
shift
echo shifted
echo "%1"
)

如果条件为 FALSE,则跳过整个 block 。如果条件为 TRUE,则 GOTO 立即终止该 block ,然后在 :true 标签处正常执行(无 block 上下文)。末尾的额外 ) 将被忽略。

请注意,您不能使用此构造添加 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
)

如果为 FALSE,则仅执行 ELSE block 。如果为 TRUE,则执行顶部 block 并立即将其杀死。代码的其余部分被执行,并且 ) else ( 行被忽略,因为 ) 函数如果解析器期待命令并且堆栈上没有事件的括号 block ,则作为 REM。

我强烈建议您永远不要像我在上面显示的那样(或像 Vladislav 所做的那样)转到带括号的代码块中的标签。

下面是做同样事情的更好(更简单且不会误导)的方法:

@echo off
if not "%1"=="/p" goto :skip
echo "%1"
shift
echo shifted
echo "%1"

:skip

您可以使用一些额外的标签和 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

关于Windows 批量转移在 if block 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17241184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com