我想通过执行查找替换并更改路径中的“原始”部分来将变量从更改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)