2

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

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

4

1 回答 1

1

tl;博士

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

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


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

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

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

  • -NewNamefor指定每个输入项在其当前位置Rename-Item的新名称,无论它在哪里。

  • -DestinationforMove-Item指定每个输入项的新路径,并指定相对路径,包括单纯的文件与调用者的位置相关,与输入文件的位置无关。

一般模式是:

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 }

注意:增加$indexvia++(Get-Variable -Scope 1 $index).Value而不仅仅是++$index必要的,因为 delay-bind 脚本块在变量范围内运行,其中++$index会隐式创建一个在每次调用后超出范围的局部变量 - 有关更详细的解释,请参阅 此答案$index

于 2018-12-01T22:00:21.240 回答