问题描述
我在编码方面不是很了解,但我正在尝试使用 PowerShell 找到一种方法来从多个文件中删除前 X 个字符和最后 X 个字符。因此,只保留中间部分。
例如) INV~1105619~43458304~~1913216023~0444857 ,其中 1913216023 是发票号。需要从文件名中删除之前和之后的任何内容。
我用过: get-childitem *.pdf | rename-item -newname { string.substring(22) } 删除前 22 个字符,但无法创建代码来删除剩余的一半。所有文件的字符数相同,但发票号前后的数字不同(每个文件名不同)。
非常感谢任何帮助/建议!
解决方法
有几种方法可以做到这一点。
如果您确定不会遇到命名冲突(因此所有文件都有不同的发票编号),请使用以下三个额外的替代方法:
(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})~.+$','$1'),$_.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\foo\1913216023".