PowerShell 替换语法:正则表达式替换和环境变量



我正在尝试替换正则表达式和环境变量,但找不到正确的语法(因为单引号和双引号不匹配(。我正在开发的短脚本将重命名文件。这是我尝试的几种设置

# Original File Name: (BRP-01-001-06K48b-SC-CC-01).tif
# Desired File Name:  (BRP-12-345-06K48b-SC-CC-01).tif
# Variables defined by user:
PS ..user> $pic,$change="01-001","12-345"
# The problem is with the "-replace" near the end of the command
PS ..user> get-childitem .* -recurse | where-object {$_.BaseName -match ".*(BRP-$pic-.{15}).*"} | foreach-object {$orig=($_.FullName); $new=($orig -replace "((BRP-)($pic)(-.{15}))", '$1$change$3'); echo $new}
PS ..user> (BRP-$change-06K48b-SC-CC-01).tif
# Also tried:
PS ..user> get-childitem .* -recurse | where-object {$_.BaseName -match ".*(BRP-$pic-.{15}).*"} | foreach-object {$orig=($_.FullName); $new=($orig -replace "((BRP-)($pic)(-.{15}))", "`$1$change`$3"); echo $new}
PS ..user> $112-345-06K48b-SC-CC-01).tif
# If I put a space before $change:
PS ..user> get-childitem .* -recurse | where-object {$_.BaseName -match ".*(BRP-$pic-.{15}).*"} | foreach-object {$orig=($_.FullName); $new=($orig -replace "((BRP-)($pic)(-.{15}))", "`$1 $change`$3"); echo $new}
PS ..user> (BRP- 12-345-06K48b-SC-CC-01).tif

在最后一个示例中,如果我在$change之前添加空格,它就会"工作"......但我不想要空间。我意识到我可以做另一个replace操作来修复空间,但如果可能的话,我想在一个命令中完成这一切。

使用环境变量和正则表达式替换需要替换什么语法?

此外,出于好奇,一旦工作,这会替换文件名中的所有匹配项还是仅替换第一个。例如,文件将:

"Text (BRP-01-001-06K48b-SC-CC-01) Text (BRP-01-001-06K48b-SC-OR-01)"

更改为:

"Text (BRP-12-345-06K48b-SC-CC-01) Text (BRP-12-345-06K48b-SC-OR-01)"

或者只有第一场比赛,例如:

"Text (BRP-12-345-06K48b-SC-CC-01) Text (BRP-01-001-06K48b-SC-OR-01)"

最佳做法是用{}将捕获组名称括起来,或者在替换字符串中使用命名的捕获组。将{}与第二个示例一起使用,应该效果很好。

"Text (BRP-01-001-06K48b-SC-CC-01) Text (BRP-01-001-06K48b-SC-OR-01)" -replace "((BRP-)($pic)(-.{15}))", "`${1}$change`${3}"

当 PowerShell 变量、捕获组和字符串文本位于替换字符串中时,不能使用周围的单引号。使用周围的双引号允许发生内部扩展。因此,您需要反引转义$用于标识捕获组。

您的第二个示例通常具有正确的语法,但由于$change以数字开头,因此会产生意想不到的后果。您正在转义替换字符串中的$以使用捕获组13。由于$change的计算结果为12-345,预期的捕获组1实际上是不存在的捕获组112。请参阅下面的第二次尝试图示:

"((BRP-)($pic)(-.{15}))"

  • 捕获组 1:(BRP-
  • 捕获组 2:01-001
  • 捕获组 3:-06K48b-SC-CC-01)

运行时"`$1$change`$3"变为$112-345$3,然后变为$112-345-06K48b-SC-CC-01)。请注意,在替换捕获组之前,已对$112进行了插值。然后选中捕获组112。由于它不存在,因此$112只是假定为字符串。

以下可能是你所追求的,

$pic = "01-001"
$change = "12-345"
$RenameFiles_FilterStr = "*BRP-$pic*.tif"
gci $RenameFiles_FilterStr -recurse | % { $_.BaseName -replace $pic,$change }
# The above returns renamed strings (files not renamed yet). If the expected result matches the returned ones, then uncomment the below and run to rename the files
# gci $RenameFiles_FilterStr -recurse | % { Rename-Item -NewName ($_.BaseName -replace $pic,$change) }

最新更新