在Powershell中使用new-guid重命名每个文件

时间:2018-12-01 12:35:26

标签: powershell rename guid rename-item-cmdlet

我一直在尝试使用文件名$New-Guid。txt重命名文件夹中的每个txt文件,因此它们都应具有唯一的名称。

有人知道这样做的简单方法吗?

1 个答案:

答案 0 :(得分:0)

tl; dr

Get-ChildItem ... | Rename-Item -NewName { "$(New-Guid).txt" }

请注意使用脚本块({ ... }以及对expandable string ("...")中嵌入的New-Guid内部$(...)的调用。


使用多个输入文件进行文件重命名/移动操作最有效地通过delay-bind script blocks 进行,将脚本块({ ... })传递给-NewName / -Destination参数为每个输入文件计算新名称/名称和/或位置 ,从而可以指定新文件名:

  • 作为 input 文件名的转换
  • 和/或作为自动生成的文件名,该文件名基于例如序列号或您的GUID。

以下仅讨论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