gpt4 book ai didi

batch-file - 如何将参数传递给包含 % 的批处理文件,而没有它 'breaking' ?

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

问题

在主批处理文件中,值从 .txt 文件中提取(和 SET 作为该批处理文件中变量的值)。这些值可能都包含 %人物。

这些是从 .txt 文件中读取的,没有问题。但是,当一个变量的值包含 %字符被传递到第二个批处理文件,第二个批处理文件解释任何 %字符作为变量扩展。 (注意:有 没有 控制第二个批处理文件。)

示例

echo %PERCENTVARIABLE%

输出: I%LOVE%PERCENT%CHARACTERS%
当传递给第二个文件然后回显时,(可能)会变成 IPERCENT ,正如它解释的那样 %LOVE%%CHARACTERS%作为未设置的变量。

研究

我找到了在批处理文件中查找和替换字符串中元素的语法,因为我认为我可能会替换 %字符与 %%为了逃避它。但是我无法让它工作。

语法是——
set string=This is my string to work with.
set string=%string:work=play%
echo %string%

那么输出将是 This is my string to play with. .

问题
  • 是否有可能逃脱% 使用查找和替换语法的字符
    在一个变量? (如果没有,还有其他方法吗?)
  • 这样做是否可取? (使用这些转义字符是否会在第二个批处理文件中导致任何问题(如上所述)我们无法控制?)
  • 有没有其他方法来处理这个问题 ,如果以上是不可能的?
  • 最佳答案

    没有适用于所有情况的简单规则。

    有一些问题使得在参数中使用字符串文字变得困难:

  • 毒角色如 & , |等必须转义或引用。逃跑很困难,因为逃跑的次数可能会令人困惑。所以建议通常引用字符串。
  • token 分隔符,如 <space> , <tab> , = , ;,除非被引用,否则不能包含在参数值中。
  • 对脚本的调用将使任何引用的 % 加倍字符,还有 没有办法阻止这种情况 .在没有 CALL 的情况下执行脚本不会加倍 %人物。但是,如果一个脚本调用另一个脚本并希望返回控制权,则必须使用 CALL。

  • 所以我们有一个 catch-22:一方面,我们想要引用参数来防止有害字符和空格( token 分隔符)。但为了保护百分比,我们不想引用。

    在不担心值损坏的情况下可靠地传递字符串文字的唯一可靠方法是通过环境变量通过引用传递它们。
  • 要传递的值应存储在环境值中。引号和/或转义和/或百分比加倍用于获取值中的必要字符,但它非常易于管理。
  • 变量的名称作为参数传入。
  • 该脚本通过延迟扩展访问该值。例如,如果第一个参数是包含该值的变量的名称,那么它被访问为 !%1! .在使用该语法之前必须启用延迟扩展 - 只需发出 setlocal enableDelayedExpansion .

  • 延迟扩展的美妙之处在于,当变量扩展时,您永远不必担心有害字符、空格或百分比的损坏。

    这是一个示例,显示如何将以下字符串文字传递给子例程 "<%|,;^> This & that!" & the other thing! <%|,;^>
    @echo off
    setlocal enableDelayedExpansion
    set "parm1="^<%%^|,;^^^^^> This ^& that^^!" & the other thing^! <%%|,;^^^>"
    echo The value before CALL is !parm1!
    call :test parm1
    exit /b

    :test
    echo The value after CALL is !%1!

    - 输出 -
    The value before CALL is "<%|,;^> This & that!" & the other thing! <%|,;^>
    The value after CALL is "<%|,;^> This & that!" & the other thing! <%|,;^>

    但是您声明您无法控制第二个被调用的脚本。因此,上述优雅的解决方案对您不起作用。

    如果您要显示第二个脚本的代码,并准确显示您尝试传递的值,那么我可能会提供一个在这种孤立情况下有效的解决方案。但是有些值根本无法传递,除非延迟扩展与变量名一起使用。 (实际上,另一种选择是将值放入文件并从文件中读取值,但这也需要更改您的第二个脚本)

    关于batch-file - 如何将参数传递给包含 % 的批处理文件,而没有它 'breaking' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39720052/

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