Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex PowerShell替换语法:正则表达式替换和环境变量_Regex_Powershell_Replace - Fatal编程技术网

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

Regex PowerShell替换语法:正则表达式替换和环境变量,regex,powershell,replace,Regex,Powershell,Replace,我试图替换regex和环境变量,但找不到正确的语法(因为单引号和双引号不匹配)。我正在开发的短脚本将重命名文件。下面是我的设置看起来像我尝试的一些方法 # 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="

我试图替换regex和环境变量,但找不到正确的语法(因为单引号和双引号不匹配)。我正在开发的短脚本将重命名文件。下面是我的设置看起来像我尝试的一些方法

# 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)"

下面可能是你想要的

$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) }

最佳做法是在
{}
中使用捕获组名称,或者在替换字符串中使用命名的捕获组。在第二个示例中使用
{}
,应该可以很好地解决问题

"Text (BRP-01-001-06K48b-SC-CC-01) Text (BRP-01-001-06K48b-SC-OR-01)" -replace "(\(BRP-)($pic)(-.{15}\))", "`${1}$change`${3}"
当PowerShell变量、捕获组和字符串文字位于替换字符串中时,不能使用周围的单引号。使用周围的双引号可以进行内部扩展。因此,您需要勾选用于标识捕获组的escape
$

第二个示例通常具有正确的语法,但由于
$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
被假定为一个字符串。

这是否回答了您的问题?感谢您的解答和解释;这正是我需要学习的。谢谢你。虽然我正在处理的实际问题更加复杂,需要正则表达式替换的灵活性,但我非常喜欢您提供的简明解决方案(因为它解决了我提出的问题)。曾经有很多次,我可以使用像您这样的简单解决方案,我预计在我当前项目之外的将来,我会经常使用它。它的简洁真的很优雅