我一直在尝试使用文件名$New-Guid
。txt重命名文件夹中的每个txt文件,因此它们都应具有唯一的名称。
有人知道这样做的简单方法吗?
答案 0 :(得分:0)
tl; dr
Get-ChildItem ... | Rename-Item -NewName { "$(New-Guid).txt" }
请注意使用脚本块({ ... }
以及对expandable string ("..."
)中嵌入的New-Guid
内部$(...)
的调用。
使用多个输入文件进行文件重命名/移动操作最有效地通过delay-bind script blocks 进行,将脚本块({ ... }
)传递给-NewName
/ -Destination
参数为每个输入文件计算新名称/名称和/或位置 ,从而可以指定新文件名:
以下仅讨论Rename-Item -NewName
,但类似地适用于Move-Item -Destination
,但要注意一个重要区别:
-NewName
的 Rename-Item
为当前位置中的每个输入项目 指定新的名称。 p>
-Destination
的 Move-Item
为每个输入项指定新的 path ,并指定 relative 路径,包括一个文件名称,相对于调用者的位置 ,而与输入文件的位置无关。
常规模式是:
Get-ChildItem ... | Rename-Item -NewName { ... }
请注意,输入文件也可以通过Get-Item
,路径 strings 或具有.Path
属性的对象来指定。
转化示例:
比方说,您想通过使用*.txt
为文件名加前缀来重命名当前目录中的所有foo-
文件。
在脚本块{ ... }
中,自动变量$_
指代手边的输入对象,如PowerShell中的习惯。
使用Get-ChildItem
的文件输入,$_
是类[System.IO.FileInfo]
的实例,允许您访问其.Name
属性以获取文件 name 。
Get-ChildItem *.txt | Rename-Item -NewName { 'foo-' + $_.Name }
自动生成示例,其中包含序列号 :
假设您要重命名当前目录中的所有*.txt
文件,方法是在文件名前添加一个基于数字的1序列号,后跟-
,例如01-
。
$index = 0
Get-ChildItem *.txt |
Rename-Item -NewName { '{0:00}-{1}' -f ++([ref] $index).Value, $_.Name }
注意:必须通过$index
而不是仅++([ref] $index).Value
来递增++$index
,因为延迟绑定脚本块在 child 变量范围内运行,其中{ {1}}会隐式创建一个 local ++$index
变量-有关更详细的说明,请参见this answer。