在 PowerShell Invoke-Expression 中转义括号

在 PowerShell Invoke-Expression 中转义括号

下面是我正在编写的单行脚本,当我尝试在其中添加 open-paran 时会出现问题invoke-expression

在脚本中,文件map.txt包含 800 行 3 位数字。该脚本旨在通过在现有文件前添加新的(唯一)三位数和空格来更改以 001..400(唯一/不重复)开头的现有文件的名称。为此,从中提取一个三位数来map.txt查找我想要重命名的文件(使用invoke-expression "ls $line1 (*",下一行map.txt是应该作为现有文件前缀的数字。因此,如果前两行map.txt001008,则文件001 (additional characters).ext(括号是文件名的一部分)将更改为008 001 (additional characters).ext

如果我删除 中的 open-paran,它将执行invoke-expression。但是,如果没有在invoke-expression 中的 open-paran,当文件map.txt达到 的数字对时008 021,它将尝试重命名008 001 (additional characters).ext已经重命名的 。添加 open-paren 会使文件名唯一,而不管已经发生的名称更改如何,并且脚本应该按预期执行。也就是说,如果我能弄清楚如何在 中包含 open-paren invoke expression。我可能可以用几行正则表达式和 来解决这个问题,-match但如果我能找到一个快速解决方案来包含 open-paran invoke-expression,那就太理想了。

感谢您的帮助。

for ($i=0; $i -lt 800; $i=($i+"2")) {$line1=(get-content ..\map.txt | select -index $i); $line2=(get-content ..\map.txt | select -index ($i+"1")); $old=(invoke-expression 'ls $line1 (*'); $fileold=($old.basename+$old.extension); $filenew=($line2+" "+$fileold); mv "$fileold" "$filenew"} 

答案1

为了使Invoke-Expression 'ls $line1 (*'Invoke-Expression "ls $line1 (*"按预期工作,请使用不同的引号引用要传递给的行ls,例如Invoke-Expression 'ls "$line1 (*"'Invoke-Expression "ls '$line1 (*'"


另外,我建议大家进行如下的代码优化:

$numbers = Get-Content -Path "..\map.txt"
for ($i = 0; $i -lt 400; $i++) {
    Get-Item -Path "$($numbers[2*$i]) (*" | ForEach-Object -Process {Rename-Item -Path $_.Name -NewName "$($numbers[2*$i+1]) $($_.Name)"}
}

如果你想把它压缩成一行,你可以这样做:

$n=gc ..\map.txt;for($i=0;$i-lt400;$i++){gi "$($n[2*$i]) (*"|%{rni $_ "$($n[2*$i+1]) $($_.Name)"}}

相关内容