我一直在尝试用文件名$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
变量,该变量在每次调用后都会超出作用域-有关更详细的解释,请参阅此答案。