删除文件名部分 w/PowerShell
Remove Sections of File Names w/PowerShell
我在编码方面不是很了解,但我正在尝试使用 PowerShell 找到一种方法来从多个文件中删除前 X 个字符和最后 X 个字符。因此,只保留中间部分。
例如)
INV~1105619~43458304~~1913216023~0444857 ,其中 1913216023 是发票编号。之前和之后的任何内容都需要从文件名中删除。
我用过:
获取子项目 *.pdf | rename-item -newname { string.substring(22) } 删除前 22 个字符,但无法创建代码来删除剩余的一半。所有文件的字符数相同,但发票号前后的数字不同(每个文件名不同)。
非常感谢help/advice!
有几种方法可以做到这一点。
如果您确定不会 运行 发生命名冲突(因此所有文件都有不同的发票编号),请使用以下三个额外选项:
(Get-ChildItem -Path 'D:\Test' -Filter '*~~*~*.pdf' -File) |
Rename-Item -NewName {
# my favorite method
'{0}{1}' -f ($_.BaseName -split '~')[-2], $_.Extension
# or
# '{0}{1}' -f ($_.BaseName -replace '^.*~~(\d{10})~.+$', ''), $_.Extension
# or this one
# '{0}{1}' -f ([regex]'~~(\d+)~').Match($_.BaseName).Groups[1].Value, $_.Extension
# or if you are absolutely sure of the position and length of the invoice number
# '{0}{1}' -f $_.BaseName.Substring(22,10), $_.Extension
}
Get-ChildItem
行位于方括号之间,以确保在继续之前收集 FileInfo 对象已完成。如果您不这样做,您可能会多次尝试重命名项目
假设目标子字符串总是具有相同的长度,substring() 有一个具有长度参数的重载。
'INV~1105619~43458304~~1913216023~0444857'.substring
OverloadDefinitions
-------------------
string Substring(int startIndex)
string Substring(int startIndex, int length)
$startIndex, $length = 22, 10
'INV~1105619~43458304~~1913216023~0444857'.substring($startIndex, $length)
1913216023
dir ('?'*40) | rename-item -newname { $_.name.substring(22,10) } -whatif
What if: Performing the operation "Rename File" on target
"Item: C:\users\admin\foo\INV~1105619~43458304~~1913216023~0444857
Destination: C:\users\admin\foo13216023".
我在编码方面不是很了解,但我正在尝试使用 PowerShell 找到一种方法来从多个文件中删除前 X 个字符和最后 X 个字符。因此,只保留中间部分。
例如) INV~1105619~43458304~~1913216023~0444857 ,其中 1913216023 是发票编号。之前和之后的任何内容都需要从文件名中删除。
我用过: 获取子项目 *.pdf | rename-item -newname { string.substring(22) } 删除前 22 个字符,但无法创建代码来删除剩余的一半。所有文件的字符数相同,但发票号前后的数字不同(每个文件名不同)。
非常感谢help/advice!
有几种方法可以做到这一点。
如果您确定不会 运行 发生命名冲突(因此所有文件都有不同的发票编号),请使用以下三个额外选项:
(Get-ChildItem -Path 'D:\Test' -Filter '*~~*~*.pdf' -File) |
Rename-Item -NewName {
# my favorite method
'{0}{1}' -f ($_.BaseName -split '~')[-2], $_.Extension
# or
# '{0}{1}' -f ($_.BaseName -replace '^.*~~(\d{10})~.+$', ''), $_.Extension
# or this one
# '{0}{1}' -f ([regex]'~~(\d+)~').Match($_.BaseName).Groups[1].Value, $_.Extension
# or if you are absolutely sure of the position and length of the invoice number
# '{0}{1}' -f $_.BaseName.Substring(22,10), $_.Extension
}
Get-ChildItem
行位于方括号之间,以确保在继续之前收集 FileInfo 对象已完成。如果您不这样做,您可能会多次尝试重命名项目
假设目标子字符串总是具有相同的长度,substring() 有一个具有长度参数的重载。
'INV~1105619~43458304~~1913216023~0444857'.substring
OverloadDefinitions
-------------------
string Substring(int startIndex)
string Substring(int startIndex, int length)
$startIndex, $length = 22, 10
'INV~1105619~43458304~~1913216023~0444857'.substring($startIndex, $length)
1913216023
dir ('?'*40) | rename-item -newname { $_.name.substring(22,10) } -whatif
What if: Performing the operation "Rename File" on target
"Item: C:\users\admin\foo\INV~1105619~43458304~~1913216023~0444857
Destination: C:\users\admin\foo13216023".