我正在尝试替换正则表达式和环境变量,但找不到正确的语法(因为单引号和双引号不匹配(。我正在开发的短脚本将重命名文件。这是我尝试的几种设置
。# 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
以数字开头,因此会产生意想不到的后果。您正在转义替换字符串中的$
以使用捕获组1
和3
。由于$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) }