微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过删除文件名中@ 标记之后的所有内容,使用 powershell 重命名文件

如何解决通过删除文件名中@ 标记之后的所有内容,使用 powershell 重命名文件

我有文件名为 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
  }

优点:

  • 只会选择文件。
  • 如果向其提供不包含 @ 的文件,则不会导致错误。
  • 修剪后压缩文件名中的尾随空格。
  • 更容易理解。

HTH

,

您可以使用更好的过滤器、延迟绑定脚本块和一点正则表达式来使这非常简洁。

Get-ChildItem -Filter *@*.pdf -File |
    Rename-Item -NewName {$_.name -replace '@.+(?=\.)'}

一个潜在的问题是文件名重复。这段代码没有考虑到这一点。

,

我实际上尝试了 Bulk Rename Utility 并且它完成了工作。我不知道它是否安全,但它有效。如果有人知道这不安全,请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?