如何对 Windows 批处理文件字符串进行查找替换?

如何对 Windows 批处理文件字符串进行查找替换?

我想通过执行查找替换并更改路径中的“原始”部分来将变量从更改some\original\path为。some\replaced\path

set x=some\original\path
set y= ????
(y is now some\replaced\path)

我如何在 Windows 批处理文件中执行此操作?请注意:

  • 我希望保持代码的灵活性,因此不需要对字符串或字符索引进行硬编码
  • 我也对 Powershell 解决方案很满意。我正在寻找最简单、最易于维护且可以在我的 Windows 7 机器上运行的解决方案。

解决方案:

在批处理文件中,你可以在%%插值过程中进行字符串替换

set y=%x:original=replaced%

答案1

编辑:回答已澄清的问题:

如果您可以确保original始终相同,并且仅在路径中出现一次,请使用:

@Echo Off
Set "Find=original"
Set "Replace=replaced"
Set "OldPath=%~1"
Call Set "NewPath=%%OldPath:\%Find%\=\%Replace%\%%"
Echo %NewPath%

\original\这将用替换的第一个实例\replaced\。测试:

C:\> ChangePath.bat "Alice\original\Clive"
Alice\replaced\Clive

C:\> ChangePath.bat "Alice\original\Clive\Denver"
Alice\replaced\Clive\Denver

C:\> ChangePath.bat "Alice\Bob\original\Clive"
Alice\Bob\replaced\Clive

上一个答案

要更改路径的第二部分,您可以使用:

@Echo Off
Set "Replace=Replacement Path"
Set "PathABC=%~1"
Set "PathBC=%PathABC:*\=%"
Call Set "PathA=%%PathABC:\%PathBC%=%%"
Set "PathC=%PathBC:*\=%"
Set "NewPath=%PathA%\%Replace%\%PathC%"
Echo %NewPath%

测试:

C:\> ChangePath.bat "Alice\Bob\Clive"
Alice\Replacement Path\Clive

这依赖于没有前导斜杠。它会替换第一个和第二个斜杠之间的文本。


编辑:解释一下什么%%意思。

%%是一种转义百分号的方法。如果我写下以下行,它将被视为% Green 50%一个变量。由于该变量未定义,它将写入以下输出。

C:\> Echo Red 90% Green 50% Blue 5%
Red 90 Blue 5%

我需要写的内容是:

C:\> Echo Red 90%% Green 50%% Blue 5%%
Red 90% Green 50% Blue 5%

下面的一行经过了一些变换。下面是其变换的每个步骤。

:: Original line
Call Set "NewPath=%%OldPath:\%Find%\=\%Replace%\%%"

:: The variables encased in single `%` are evaluated:
Call Set "NewPath=%%OldPath:\original\=\replaced\%%"

:: `Call` runs the rest of the line as a command.  The `%%` are evaluated to `%`.
Set "NewPath=%OldPath:\original\=\replaced\%"

:: The search and replace on `OldPath` occurs.
Set "NewPath=Alice\replaced\Clive"

:: The final command is processed.

答案2

使用 PowerShell,您可以使用-replace运算符:

$x = 'some\original\path'
$y = $x -replace 'original','replaced'

-replace运算符使用正则表达式,因此您也可以执行以下操作:

$y = $x -replace '\\\w+\\','\replaced\'

答案3

不清楚这是否是您想要的,但在 PowerShell 中,字符串替换非常容易:

$x = "some\original\path"
$y = $x.Replace("original", "replaced")

应该能给你你想要的东西(我希望)。

答案4

在 Powershell 中,替换字符串:

$string1 = "blah1\blah2.txt"
$toFind = "blah1"
$toReplace = "blah2"
$string1 = $string1.replace($toFind,$toReplace)

相关内容