重命名包含方括号的文件

问题描述 投票:1回答:2

用于批量重命名一个文件夹中的文件的PS命令适用于没有方括号对的所有文件,但如果文件名包含一个,则永远不会。如果名称中包含一个或多个右方括号,它也会起作用,但任何数量的左括号都会导致错误。

错误注释:rni:无法重命名位置“C:\ Users \ X \ documents \ folder \ machine [3] .txt”中的项目,因为它不存在。

translation _ rni:无法重命名«C:\ Users \ X \ documents \ dossier \ machine [3] .txt»中找到的元素,因为它不存在。

这是命令的代码;

$dos1=(ls C:\Users\X\documents\dos1).name
foreach ($fic in $dos1)
{rni C:\Users\X\documents\dos1\$fic §§$fic}

用户PetSerAI建议插入“-LiteralPath”对于本案例工作正常;

$dos1=(ls C:\Users\X\documents\dos1).name
foreach ($fic in $dos1)
{rni -literalpath C:\Users\X\documents\dos1\$fic §§$fic}

然而,对于更复杂的代码,同样的问题再次出现; “-LiteralPath”在以下代码中没有预期的效果;

$dos1=(ls C:\Users\X\documents\dos1).name       
$dos2=(ls C:\Users\X\documents\dos2).name
foreach ($fic2 in $dos2) {foreach ($fic1 in $dos1)
{if ("$fic1" -match "$fic2") {rni -literalpath C:\Users\X\documents\dos1\$fic1 §§$fic1}}}

更糟糕的是,重命名至少出现在一对不同的名称中:

“§§§§§§§§machine5.txt”,“machine 5.txt”。

有没有办法让这项工作没有太多额外的编码?

powershell square-bracket rename-item-cmdlet
2个回答
1
投票
  • 正如PetSerAl所指出的那样,使用-LiteralPath参数明确地按原样传递路径,而没有可能不需要的解释作为wildcard expression,因为这是路径参数的位置使用,因为隐式绑定到-Path参数。
  • 类似地,你不能使用-match来执行字符串 - 字面值比较,因为-match的RHS被设计解释为正则表达式(regular expression),其中[...]也具有特殊含义,就像它在通配符表达式中一样(尽管注意很重要)正则表达式和通配符只是远距离相关,并且通常具有根本不同的语法)。 要执行字符串 - 文字相等比较,只需使用-eq。 如果您需要字符串 - 文字子字符串匹配,请参阅this answer

因此,请使用以下内容:

$dos1=(gci -LiteralPath C:\Users\X\documents\dos1).name       
$dos2=(gci -LiteralPath C:\Users\X\documents\dos2).name
foreach ($fic2 in $dos2) {
  foreach ($fic1 in $dos1) {
   if ($fic1 -eq $fic2) { rni -LiteralPath C:\Users\X\documents\dos1\$fic1 §§$fic1 }
  }
}

注意:我已经用ls cmdlet的更多PowerShell-idiomatic别名gci替换了Get-ChildItem(与rni使用Rename-Item一致);但总的来说,最好在脚本中完全避免使用别名。

另请注意,在PowerShell中 - 与类似POSIX的shell(如Bash)不同,不需要在"..."中包含(字符串)变量,因为引用它们是正常的,即使它们包含嵌入的空格也是如此。也就是说,如果$var是一个字符串,按原样使用它 - 不需要"$var"


0
投票

像这样做...

$ Files = Get-Childitem -path \\ some \ path

Foreach($ Files中的文件){rename-item $ file.FullPath -NewName(“something”+ $ file.Name)

这是你想要的通用但有效的版本。问题是你实际上没有得到对象,你得到一个名单。

© www.soinside.com 2019 - 2024. All rights reserved.