gpt4 book ai didi

windows - 如何用命令行参数字符串替换bat文件中的字符串

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

我在 cmd 批处理文件中有以下内容:

for /f %%l in (%2) do (for %%f in (%%l) do copy "%%f" %1))

注意:此脚本的主要作用是读取包含分号分隔的 txt 文件的文本文件,该文件的路径由 %2 给出(例如,其中包含 c:\test1\file1.cs;d:\file2.js)并将文件复制到目标%1 指定的文件夹。

我需要更换 %1参数的字符串值 x (也被传递到批处理文件,例如 %3 )和 %4值也作为参数传递给批处理文件。

例如。:
if %1 = 'test replace x with y'
%3=x
%4=y

所以输出应该是'test replace y with y'

如何使用 Windows CMD 批处理解释器实现此目的?

最佳答案

首先,您必须存储 %1到一个变量中,然后您将能够执行替换。
基本上,替换的语法是这样的:

%variable:str1=str2%
这意味着:'替换每个 str1variablestr2 '。
在你的情况下 str1str2是参数,而不是文字字符串。直接使用上面的模板,你可能会得到这个表达式: %variable:%3=%4% .
但这会混淆解析器,因为它不知道 %3%4应该先评估。实际上,它会首先尝试评估 %variable:% (并失败)。
在这种情况下的解决方案之一可能是使用一种称为“懒惰”延迟评估的方法。基本上,您将正在评估变量的命令传递给 CALL 命令。原始命令到它的“CALL 版本”的转换是这样的: ECHO %var% ==> CALL ECHO %%var%% .
注意双 % s。在解析时,它们被评估为单个 % s。生成的命令将通过 CALL 再次解析,最终效果将与原始命令的情况相同, ECHO %var% .
所以它的工作方式与原始命令相同(这很好),我们在这里获得的是评估的后期时间,我的意思是最终评估,当变量实际替换为其值时。知道了这种影响,我们可以以这样的方式构建我们的表达式,即 %3%4先求值,然后是整个结果表达式。具体来说,像这样:
%%variable:%3=%4%%
在第一次解析之后,这个表达式会变成这样:
%variable:x=y%
这将再次解析,输出将是 variable的修改内容。
为了更好地说明,这里有一个简单的工作示例:
SET "output=%1"
CALL SET output=%%output:%3=%4%%
ECHO %output%

更新
还有另一种方法可以做同样的事情,我可能应该首先提到。
Windows 命令 shell 支持适当的延迟扩展。它使用起来更简单,但有一些注意事项。
第一,如何使用。延迟扩展的语法是 !var!而不是 %var%用于立即扩展(它仍然有效并且可以与延迟扩展语法一起使用)。
大概 !var!除非您使用以下命令启用语法,否则将无法在您的脚本中使用:
SETLOCAL EnableDelayedExpansion
ENDLOCAL命令关闭延迟扩展语法有效并由命令 shell 解释的块。
上面的示例脚本可以这样重写:
SET "output=%1"
SETLOCAL EnableDelayedExpansion
SET output=!output:%3=%4!
ECHO !output!
ENDLOCAL
那么在 SET output=!output:%3=%4! 的情况下这是如何工作的命令:
  • %3%4立即评估,即在解析时 - 它们被替换为 xy分别;
  • 命令变成这样:SET output=!output:x=y! ;
  • 命令即将执行 – !表达式被评估( x s 被替换为 y s);
  • 命令被执行——output变量被修改。

  • 现在关于警告。首先要记住的是 !成为语法的一部分,并在遇到时被使用和解释。因此,您需要在要将其用作文字的地方对其进行转义(例如 ^! )。
    另一个警告是 SETLOCAL/ENDLOCAL 块的主要影响。问题是,在这样一个块中对环境变量的所有更改都是本地的。在退出块时(在执行 ENDLOCAL 时),变量被设置为进入它之前(在执行 SETLOCAL 之前)的值。这对您来说意味着 output 的更改值仅在 SETLOCAL 内有效您必须首先启动以使用延迟扩展的块。在您的特定情况下,这可能不是问题,如果您只需要修改该值然后立即使用它,但您可能必须记住它以备将来使用。
    注意:根据 jeb 的评论,您可以使用以下技巧保存修改后的值并离开 SETLOCAL 块:
    ENDLOCAL & SET "output=%output%"
    &当命令位于同一行时,操作符只是将它们分隔开。它们按照指定的顺序一个接一个地执行。问题是,在解析该行时,SETLOCAL 块还没有离开,所以 %output%计算为修改后的值,该值仍然有效。但是赋值实际上是在 ENDLOCAL之后执行的,即在离开块之后。因此,您在离开块后有效地存储了修改后的值,从而保留了更改。 (谢谢, jeb !)

    更多信息:
  • 关于延迟扩展:
  • http://blogs.msdn.com/b/oldnewthing/archive/2006/08/23/714650.aspx
  • http://www.dostips.com/DtTutoFramework.php#_Toc128587174
  • 关于子串替换:
  • http://www.dostips.com/DtTipsStringOperations.php#Snippets.Replace
  • 关于windows - 如何用命令行参数字符串替换bat文件中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5816178/

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