重命名包含方括号的文件

时间:2019-04-14 12:07:22

标签: powershell square-bracket rename-item-cmdlet

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

错误注释: rni:放置位置不可能«C:\ Users \ X \ documents \ dossier \ machine [3] .txt»,可能已存在。

翻译_ 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 ”。

有没有一种方法可以使这项工作无需太多额外的编码?

2 个答案:

答案 0 :(得分:1)

  • 正如PetSerAl所指出的那样,请使用-LiteralPath参数明确地按原样传递路径,而不必将其解释为wildcard expression,因为这就是-Path参数,因此对路径参数进行了>位置的使用。

  • 类似地,您不得使用-match进行字符串-文字比较,因为-match的RHS在设计上被理解为 regex regular expression),其中[...]也具有特殊含义,就像在通配符表达式中一样(尽管要特别注意的是regexe和通配符仅在远处相关,并且通常具有根本不同的语法) )。

    • 要执行字串上的平等比较,只需使用-eq
    • 如果您需要字串上的 substring 匹配,请参见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惯用别名gci替换了Get-ChildItem(与您将{{1}使用rni一致});总体而言,最好完全避免在脚本中使用别名。

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

答案 1 :(得分:0)

像这样...

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

Foreach($ Files中的$ file){重命名项目$ file.FullPath -NewName(“某物” + $ file.Name)

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