我一直在尝试使用文件名$New-Guid
.txt 重命名文件夹中的每个 txt 文件,因此它们都应该具有唯一的名称。
有人知道这样做的简单方法吗?
我一直在尝试使用文件名$New-Guid
.txt 重命名文件夹中的每个 txt 文件,因此它们都应该具有唯一的名称。
有人知道这样做的简单方法吗?
tl;博士
Get-ChildItem ... | Rename-Item -NewName { "$(New-Guid).txt" }
请注意脚本块 () 的使用以及对inside{ ... }
的调用嵌入在可扩展字符串( )中。New-Guid
$(...)
"..."
使用延迟绑定脚本块最有效地执行具有多个输入文件的文件重命名/移动操作{ ... }
,其中传递给-NewName
/参数的脚本块 ( ) 计算每个输入文件-Destination
的新名称/名称和/或位置,从而可以指定新文件名:
以下仅讨论Rename-Item -NewName
,但它类似地适用于Move-Item -Destination
,但请注意一个重要区别:
-NewName
for指定每个输入项在其当前位置Rename-Item
的新名称,无论它在哪里。
-Destination
forMove-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 }
注意:增加$index
via++(Get-Variable -Scope 1 $index).Value
而不仅仅是++$index
必要的,因为 delay-bind 脚本块在子变量范围内运行,其中++$index
会隐式创建一个在每次调用后超出范围的局部变量 - 有关更详细的解释,请参阅 此答案。$index