powershell - 在 powershell 中使用 new-guid 重命名每个文件
问题描述
我一直在尝试使用文件名$New-Guid
.txt 重命名文件夹中的每个 txt 文件,因此它们都应该具有唯一的名称。
有人知道这样做的简单方法吗?
解决方案
tl;博士
Get-ChildItem ... | Rename-Item -NewName { "$(New-Guid).txt" }
请注意脚本块 () 的使用以及对inside{ ... }
的调用嵌入在可扩展字符串( )中。New-Guid
$(...)
"..."
使用延迟绑定脚本块最有效地执行具有多个输入文件的文件重命名/移动操作{ ... }
,其中传递给-NewName
/参数的脚本块 ( ) 计算每个输入文件-Destination
的新名称/名称和/或位置,从而可以指定新文件名:
- 作为输入文件名的转换
- 和/或作为基于例如序列号的自动生成的文件名,或者在您的情况下,GUID。
以下仅讨论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
推荐阅读
- javascript - 如何制作多个文本叠加层
- java - 弹簧注释自动装配字段的空指针异常
- jquery - 我如何从选定的 li 中获取特定的 div 文本
- javascript - 将 ThreeCSG 与 BufferGeometry 一起使用给了我奇怪的结果 - 缺少面孔
- mysql - Mysql基于小时的累计求和
- spring-boot - 偏移量超出范围重置偏移量第二个消费者组
- design-patterns - Is it possible to use polymorphism with an abstraction layer for different widgets in Flutter?
- python - 如何更改字典中的变量
- arduino - 有没有办法用 Adafruit 1411 Servo shield 以角度写入伺服位置?
- sql - 多重联接仅返回匹配的字段