用于批量重命名一个文件夹中的文件的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”。
有没有办法让这项工作没有太多额外的编码?
-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"
。
像这样做...
$ Files = Get-Childitem -path \\ some \ path
Foreach($ Files中的文件){rename-item $ file.FullPath -NewName(“something”+ $ file.Name)
这是你想要的通用但有效的版本。问题是你实际上没有得到对象,你得到一个名单。