Powershell 文件重命名语法

Posted

技术标签:

【中文标题】Powershell 文件重命名语法【英文标题】:Powershell file rename syntax 【发布时间】:2021-02-26 11:35:35 【问题描述】:

我正在尝试重命名给定目录中的所有文件,以便它们具有顺序格式 001a.jpg、001b.jpg、002a.jpg 等。

我试过了:

$c=1
get-childitem * | foreach 
if($c/2=[int]($c/2))
rename-item -NewName ($c-1) + 'b.jpg' else rename-item - NewName $c + 'a.jpg'$c++ - whatif

但我得到“赋值运算符无效”。

第三行中的 = 显然不应该是赋值运算符。我只想检查计数器是否在偶数上。我发现 -ne 表示不等于,但 PS 似乎不喜欢 -。

我不确定新名称的语法,但解析器没有得到那么远的 ATM。

感谢任何指点。

编辑:我刚刚意识到数字会跳过,但一旦我了解了我已有的问题,我可以解决这个问题。

【问题讨论】:

在比较运算符 -eq-ne 等周围留有空格,否则破折号会被视为等式 $c/2 的减号 P.S.要测试一个数字是否为奇数,使用if ($c % 2)if ($c -band 1) 可能会更快 非常感谢。我认为比较运算符现在还可以,但 foreach 似乎存在问题。我收到“ForEach-Object:无法绑定参数'RemainingScripts'。无法将“System.String”类型的“-”值转换为“System.Management.Automation.ScriptBlock”类型。” 由于您的编辑“一旦我了解了我已有的问题,我就可以解决这个问题”我只解决了您遇到的比较问题。你没有要求审查/修复所有代码的小事.. 【参考方案1】:

如评论所述,如果您在 -eq-ne 运算符周围不留空格,PowerShell 会将破折号解释为属于数学运算,因此

if($c/2-ne[int]($c/2))

会失败。

另外,要测试一个数字是否为奇数,使用if ($c % 2)if ($c -band 1) 可能更快。

使用-not 测试偶数。

【讨论】:

【参考方案2】:

您需要了解的几件事(有些只是建议):

    每个 if-else 分支都需要大括号 如果不通过管道将项目输入到Rename-Item,则必须指定路径 如果为Rename-Item 指定路径,则不能为-NewName 使用脚本块 如果左边的操作数是int,右边是string,则不能使用+,因为它会被解释为加法并且需要两个数字。 您不能在整个构造上使用-WhatIf 开关,而只能使用单个命令 该命令只使用一次就足够了,并且只使用 if-else 来设置新名称 您可以使用模运算符 % 简化您的条件(如其他答案和 cmets 中所述) 可以使用-Begin参数进行初始化 Get-ChildItem* 不是必需的

这是更新后的代码:

Get-ChildItem | foreach -Begin  $c = 1  -Process 
    if ($c % 2) 
        $newName = "$ca.jpg"
    
    else 
        $newName = "$($c-1)b.jpg"
    
    Rename-Item -LiteralPath $_.FullName -NewName $newName -WhatIf
    $c++

这是一个更短的版本,直接通过管道连接到Rename-Item

$c = 0
Get-ChildItem |
  Rename-Item -NewName if (++$script:c % 2) "$ca.jpg" else "$($c-1)b.jpg" -WhatIf

【讨论】:

以上是关于Powershell 文件重命名语法的主要内容,如果未能解决你的问题,请参考以下文章

使用 Powershell 递归重命名文件

复制文件重命名(如果已存在)PowerShell

如果文件存在,Powershell 移动项目重命名

使用 PowerShell 重命名 FTP 上的文件

PowerShell重命名文件夹中的文件For循环错误

Powershell 批量重命名文件