gpt4 book ai didi

batch-file - 从批处理中调用批处理时如何使用&符号传递参数

转载 作者:行者123 更新时间:2023-12-04 10:20:31 33 4
gpt4 key购买 nike

foo.bat:

call qwe.bat "hello && bye"

qwe.bat:
@echo off
set cmd=%~1
echo "%cmd%"

当我执行 foo.bat我收到一个错误:
'bye' is not recognized as an internal or external command,
operable program or batch file.
"hello "

那么如何传递字符串 "hello && bye"来自 foo.batqwe.bat ?
看起来和号是导致问题的原因 🤔

最佳答案

批量转义规则非常讨厌,但如果您了解规则,则行为是完全可以预测的。

您需要了解问题的信息可在 Windows 命令解释器 (CMD.EXE) 如何解析脚本?在已接受答案的第 1、2、5 和 6 阶段。但祝你好运很快吸收这些信息:-)

有两个基本的设计问题会导致您的问题: - 第 6 阶段将所有插入符加倍,然后重新启动第 2 阶段(实际上是第 1、1.5 和 2 阶段)。 - 但是第 2 阶段需要将 & 转义为 ^&。注意一定是单个^,不能加倍!

使您的方法起作用的唯一方法是在第 6 阶段插入符号加倍发生后引入 ^。

@echo off
setlocal enableDelayedExpansion
set "ESC=^"

rem Calling with delayed expansion value
set "val=with%%ESC%%&ampersand"
call :Output !val!

rem Calling with a string literal
call :Output with%%ESC%%^&ampersand

exit /b

:Output
set "line=%1"
echo Called: !line!
goto :eof

ESC 被定义为保持 ^。
第一轮第一阶段扩大%%ESC%%到%ESC%
第二轮阶段 1(由阶段 6 启动)将 %ESC% 扩展为 ^

这完全是不切实际的,特别是如果您不知道内容将是什么。

将任何值可靠地传递到 CALLed 例程中的唯一明智策略是通过引用传递。传递包含字符串值的变量的名称,并使用延迟扩展在您的子例程中扩展该值。
@echo off
setlocal enableDelayedExpansion
set "val=with&ampersand"
call :Output val
exit /b

:Output
set "line=!%~1!"
echo Called: !line!
exit /b

关于batch-file - 从批处理中调用批处理时如何使用&符号传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60880436/

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