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 文件重命名语法的主要内容,如果未能解决你的问题,请参考以下文章