通过删除文件名中@标记后的所有内容,使用 powershell 重命名文件
rename files with powershell by deleting everything after the @ mark in the filename
我的文件名为
12420025@pa20s6gz@12420025_xxxgggopppxk.pdf
我想重命名它们,以便 @ 标记之后的所有内容直到 .和文件扩展名被删除。所以它看起来像
12420025.pdf
我试过了,但它给出了一个错误。我 cd 到 powershell 中的目录并尝试
Get-ChildItem -Filter *.pdf | Foreach-Object -Process {
$NewName = [Regex]::Match($@.Name,"^[^@]*").Value + '.pdf'
$@ | Rename-Item -NewName $NewName
但是我收到这个错误
At line:2 char:31
+ $NewName = [Regex]::Match($@.Name,"^[^@]*").Value + '.pdf'
+ ~
Missing ')' in method call.
At line:2 char:31
+ $NewName = [Regex]::Match($@.Name,"^[^@]*").Value + '.pdf'
+ ~~~~~~~
Unexpected token '$@.Name' in expression or statement.
At line:2 char:38
+ $NewName = [Regex]::Match($@.Name,"^[^@]*").Value + '.pdf'
+ ~
Missing argument in parameter list.
At line:1 char:55
+ Get-ChildItem -Filter *.pdf | Foreach-Object -Process {
+ ~
Missing closing '}' in statement block or type definition.
At line:2 char:47
+ $NewName = [Regex]::Match($@.Name,"^[^@]*").Value + '.pdf'
+ ~
Unexpected token ')' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndParenthesisInMethodCall
gci -Filter *.pdf|foreach {
$newname="{0}.pdf" -f ([regex]'(^.+?)(?=@)').Match($_.Name).Value
$_|Rename-Item -NewName $newname
}
希望我能给你一个关于正则表达式的很好的解释,但这不是我的强项,我只是去这里阅读:Powershell regex - match until character
稍微不那么复杂的方法:
$SourcePath = "G:\Test\PDFS\"
Get-ChildItem -Path $SourcePath -File -Filter *@*.pdf |
Foreach-Object {
$LenCut = $_.BaseName.Indexof('@')
$NewName = $_.BaseName.Substring(0,$LenCut).Trim() +
$_.Extension
$_.FullName | Rename-Item -NewName $NewName
}
优点:
- 只会 select 个文件。
- 如果你给它一个不包含@的文件不会导致错误。
- 修剪后压缩文件名中的尾随空格。
- 更容易理解。
HTH
您可以使用更好的过滤器、延迟绑定脚本块和一点正则表达式使其变得非常简洁。
Get-ChildItem -Filter *@*.pdf -File |
Rename-Item -NewName {$_.name -replace '@.+(?=\.)'}
一个潜在的问题是重复的文件名。此代码没有考虑到这一点。
我实际上试过了 Bulk Rename Utility 并且成功了。我不知道它是否安全,但它确实有效。如果有人知道它不安全,请告诉我。
我的文件名为 12420025@pa20s6gz@12420025_xxxgggopppxk.pdf
我想重命名它们,以便 @ 标记之后的所有内容直到 .和文件扩展名被删除。所以它看起来像 12420025.pdf 我试过了,但它给出了一个错误。我 cd 到 powershell 中的目录并尝试
Get-ChildItem -Filter *.pdf | Foreach-Object -Process {
$NewName = [Regex]::Match($@.Name,"^[^@]*").Value + '.pdf'
$@ | Rename-Item -NewName $NewName
但是我收到这个错误
At line:2 char:31
+ $NewName = [Regex]::Match($@.Name,"^[^@]*").Value + '.pdf'
+ ~
Missing ')' in method call.
At line:2 char:31
+ $NewName = [Regex]::Match($@.Name,"^[^@]*").Value + '.pdf'
+ ~~~~~~~
Unexpected token '$@.Name' in expression or statement.
At line:2 char:38
+ $NewName = [Regex]::Match($@.Name,"^[^@]*").Value + '.pdf'
+ ~
Missing argument in parameter list.
At line:1 char:55
+ Get-ChildItem -Filter *.pdf | Foreach-Object -Process {
+ ~
Missing closing '}' in statement block or type definition.
At line:2 char:47
+ $NewName = [Regex]::Match($@.Name,"^[^@]*").Value + '.pdf'
+ ~
Unexpected token ')' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndParenthesisInMethodCall
gci -Filter *.pdf|foreach {
$newname="{0}.pdf" -f ([regex]'(^.+?)(?=@)').Match($_.Name).Value
$_|Rename-Item -NewName $newname
}
希望我能给你一个关于正则表达式的很好的解释,但这不是我的强项,我只是去这里阅读:Powershell regex - match until character
稍微不那么复杂的方法:
$SourcePath = "G:\Test\PDFS\"
Get-ChildItem -Path $SourcePath -File -Filter *@*.pdf |
Foreach-Object {
$LenCut = $_.BaseName.Indexof('@')
$NewName = $_.BaseName.Substring(0,$LenCut).Trim() +
$_.Extension
$_.FullName | Rename-Item -NewName $NewName
}
优点:
- 只会 select 个文件。
- 如果你给它一个不包含@的文件不会导致错误。
- 修剪后压缩文件名中的尾随空格。
- 更容易理解。
HTH
您可以使用更好的过滤器、延迟绑定脚本块和一点正则表达式使其变得非常简洁。
Get-ChildItem -Filter *@*.pdf -File |
Rename-Item -NewName {$_.name -replace '@.+(?=\.)'}
一个潜在的问题是重复的文件名。此代码没有考虑到这一点。
我实际上试过了 Bulk Rename Utility 并且成功了。我不知道它是否安全,但它确实有效。如果有人知道它不安全,请告诉我。