在powershell中用新的guid重命名每个文件



我一直在尝试用文件名$New-Guid.txt重命名文件夹中的每个txt文件,所以它们都应该有唯一的名称。

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

tl;dr

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

请注意脚本块({ ... }(的使用以及嵌入可扩展字符串("..."(中的$(...)内部对New-Guid的调用。


使用多个输入文件的文件重命名/移动操作最有效地执行延迟绑定脚本块,其中传递给-NewName/-Destination参数的脚本块({ ... }(计算每个输入文件的新名称/名称和/或位置,从而可以指定新文件名:

  • 作为输入文件名的转换
  • 和/或作为自动生成的文件名,例如基于序列号,或者在您的情况下,基于GUID

以下仅讨论Rename-Item -NewName,但它类似于Move-Item -Destination,但请注意一个重要区别:

  • Rename-Item-NewName为当前位置中的每个输入项指定新的名称

  • Move-Item-Destination为每个输入项指定新的路径,并且指定相对路径(仅包括文件名称(相对于调用方的位置是,而与输入文件位于何处无关。

一般模式为:

Get-ChildItem ... | Rename-Item -NewName { ... }

请注意,输入文件也可以通过Get-Item指定为路径字符串,或者指定为具有.Path属性的对象。


转换示例

假设您想重命名当前目录中的所有*.txt文件,方法是在它们的名称前加上foo-

在脚本块{ ... }中,自动变量$_引用手头的输入对象,这是PowerShell中的惯例
使用从Get-ChildItem输入的文件,$_是类[System.IO.FileInfo]的实例,允许您访问其.Name属性以获取文件名。

Get-ChildItem *.txt | Rename-Item -NewName { 'foo-' + $_.Name }

自动生成带有序列号的示例:

假设您想重命名当前目录中的所有*.txt文件,方法是在它们的名称前加一个从1开始的两位数序列号,后跟-,例如01-

$index = 0
Get-ChildItem *.txt |
Rename-Item -NewName { '{0:00}-{1}' -f ++(Get-Variable -Scope 1 index).Value, $_.Name }

注意:通过++(Get-Variable -Scope 1 $index).Value而不仅仅是++$index来增加$index是必要的,因为延迟绑定脚本块在变量作用域中运行,其中++$index将隐式创建一个本地$index变量,该变量在每次调用后都会超出作用域-有关更详细的解释,请参阅此答案。

最新更新