重命名包含方括号的文件

Renaming files containing square braces

用于批量重命名一个文件夹中的文件的

命令对所有没有方括号的文件都有效,但如果文件名包含方括号则无效。如果名称中有一个或多个右方括号,它也有效,但任何数量的左方括号都会导致错误。

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

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

更糟糕的是,至少一对不同的名字发生了重命名:

"§§§§§§§§machine 5.txt", "machine 5.txt".

有没有一种方法可以在不需要太多额外编码的情况下完成这项工作?

  • As PetSerAl has noted, use the -LiteralPath parameter to unequivocally pass a path as-is, without the potentially unwanted interpretation as a wildcard expression,因为这就是 positional 使用路径参数所做的,因为隐式绑定到 -Path 参数.

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

    • 要执行字符串文字 相等比较 ,只需使用 -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 }
  }
}

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

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

这样做...

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

Foreach ($file in $Files) {rename-item $file.FullPath -NewName ("something" + $file.Name)

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