一个用于批量重命名一个文件夹中文件的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 ”。
有没有一种方法可以使这项工作无需太多额外的编码?
答案 0 :(得分:1)
正如PetSerAl所指出的那样,请使用-LiteralPath
参数明确地按原样传递路径,而不必将其解释为wildcard expression,因为这就是-Path参数,因此对路径参数进行了>位置的使用。
类似地,您不得使用-match
进行字符串-文字比较,因为-match
的RHS在设计上被理解为 regex (regular expression),其中[...]
也具有特殊含义,就像在通配符表达式中一样(尽管要特别注意的是regexe和通配符仅在远处相关,并且通常具有根本不同的语法) )。
-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
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)
这是您想要的通用但有效的版本。问题是您实际上并没有得到对象,而是得到了名称列表。