首页 > 解决方案 > 重命名包含方括号的文件

问题描述

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

错误注释:rni : Impossible de renommer l'élément situé à l'emplacement « C:\Users\X\documents\dossier\machine[3].txt », car il n'existe pas。

翻译_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}}}

更糟糕的是,至少有一对不同的名称会发生​​重命名:

§§§§§§§§机器 5.txt ”,“机器 5.txt ”。

有没有办法在没有太多额外编码的情况下完成这项工作?

标签: powershellsquare-bracketrename-item-cmdlet

解决方案


  • 正如PetSerAl所指出的,使用-LiteralPath参数明确地按原样传递路径,而不会将可能不需要的解释解释为通配符表达式,因为这是路径参数的位置使用所做的,因为隐式绑定到-Path参数。

  • 同样,您不能用于-match执行字符串文字比较,因为 RHS 的-match设计被解释为正则表达式正则表达式),其中[...]也具有特殊含义,就像在通配符表达式中一样(尽管重要的是要注意正则表达式和通配符只是远相关,通常具有根本不同的语法)。

    • 要执行字符串文字相等比较,只需使用-eq.
    • 如果您需要字符串文字子字符串匹配,请参阅此答案

因此,请使用以下内容:

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

注意:我已将 cmdlet 替换ls为更符合 PowerShell 惯用的别名(与您对forgci的使用一致);然而,总的来说,最好在脚本中完全避免使用别名。Get-ChildItemrniRename-Item

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


推荐阅读