下面是我正在编写的单行脚本,当我尝试在其中添加 open-paran 时会出现问题invoke-expression
。
在脚本中,文件map.txt
包含 800 行 3 位数字。该脚本旨在通过在现有文件前添加新的(唯一)三位数和空格来更改以 001..400(唯一/不重复)开头的现有文件的名称。为此,从中提取一个三位数来map.txt
查找我想要重命名的文件(使用invoke-expression "ls $line1 (*"
,下一行map.txt
是应该作为现有文件前缀的数字。因此,如果前两行map.txt
是001
和008
,则文件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)"}}