在Powershell中使用new-guid重命名每个文件 [英] rename each file with new-guid in powershell
问题描述
我一直在尝试使用文件名$New-Guid
.txt重命名文件夹中的每个txt文件,因此它们都应该具有唯一的名称.
有人知道这样做的简单方法吗?
tl; dr
Get-ChildItem ... | Rename-Item -NewName { "$(New-Guid).txt" }
请注意使用脚本块({ ... }
)以及对$(...)
内部$(...)
中的New-Guid
的调用,该脚本嵌入在 可扩展字符串("..."
).
使用
[System.IO.FileInfo]
,允许您访问其.Name
属性以获取文件 name .Get-ChildItem *.txt | Rename-Item -NewName { 'foo-' + $_.Name }
自动生成示例,其中包含序列号 :
假设您要重命名当前目录中的所有*.txt
文件,方法是在文件名前添加一个基于数字的1序列号,后跟-
,例如01-
.
$index = 0
Get-ChildItem *.txt |
Rename-Item -NewName { '{0:00}-{1}' -f ++([ref] $index).Value, $_.Name }
注意:通过++([ref] $index).Value
而不是仅通过++$index
递增$index
是必要的,因为延迟绑定脚本块在 child 变量范围内运行,其中++$index
会隐式创建一个 local $index
变量-有关详细说明,请参见此答案.
I have been trying to rename each txt file in a folder with the filename $New-Guid
.txt, so they should all have unique names.
Anyone know the simple way to do this?
tl;dr
Get-ChildItem ... | Rename-Item -NewName { "$(New-Guid).txt" }
Note the use of a script block ({ ... }
) and the call to New-Guid
inside $(...)
embedded in an expandable string ("..."
).
File renaming / moving operations with multiple input files are most efficiently performed with delay-bind script blocks, where a script block ({ ... }
) passed to the -NewName
/ -Destination
parameter calculates the new name / name and/or location for each input file, which enables specifying the new filename:
- as a transformation of the input filename
- and/or as an auto-generated filename based on, e.g., a sequence number, or, as in your case, a GUID.
The following discusses only Rename-Item -NewName
, but it applies analogously to Move-Item -Destination
, but note an important difference:
-NewName
forRename-Item
specifies the new name for each input item in its current location, wherever that is.-Destination
forMove-Item
specifies the new path for each input item, and specifying a relative path, including a mere file name, is relative to the caller's location, irrespective of where the input files are located.
The general pattern is:
Get-ChildItem ... | Rename-Item -NewName { ... }
Note that input files may alternatively be specified via Get-Item
, as path strings, or as objects with a .Path
property.
Transformation example:
Let's say you want to rename all *.txt
files in the current directory by prefixing their names with foo-
.
Inside the script block { ... }
, automatic variable $_
refers to the input object at hand, as is customary in PowerShell.
With file input from Get-ChildItem
, $_
is an instance of class [System.IO.FileInfo]
, allowing you to access its .Name
property to get the file name.
Get-ChildItem *.txt | Rename-Item -NewName { 'foo-' + $_.Name }
Auto-generation example with sequence number:
Let's say you want to rename all *.txt
files in the current directory by prefixing their names with a 1-based two-digit sequence number followed by -
, e.g., 01-
.
$index = 0
Get-ChildItem *.txt |
Rename-Item -NewName { '{0:00}-{1}' -f ++([ref] $index).Value, $_.Name }
Note: Incrementing $index
via ++([ref] $index).Value
rather than just ++$index
is necessary, because delay-bind script blocks run in a child variable scope, where ++$index
would implicitly create a local $index
variable - for a more detailed explanation, see this answer.
这篇关于在Powershell中使用new-guid重命名每个文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!