【问题标题】:Using Windows PowerShell to batch remove "[" character from filenames使用 Windows PowerShell 从文件名中批量删除“[”字符
【发布时间】:2018-01-27 22:17:15
【问题描述】:

尝试使用 PowerShell 删除一个奇怪的字符,但它一直在 [ 上中断:

文件名是test [t].txt

Dir | Rename-Item -NewName { $_.Name -replace "[","_" }

结果:

PS D:\test> 目录 |重命名项目 -NewName { $_.Name -replace "[","_" } 重命名项目:参数“NewName”的脚本块输入失败。 无效的正则表达式模式:[. 在行:1 字符:27 + 目录 |重命名项目 -NewName

我尝试了一些常用方法来转义字符 \['['、... 和 nada。

想法和想法?

PS:尝试Replace() 方法和\[ 转义:

PS D:\test> 目录 |重命名项目 -NewName{ $_.Name.Replace("\[","_")} 重命名项目:无法重命名,因为项目位于 'Microsoft.PowerShell.Core\ FileSystem::D:\test\test [t].txt' 不存在。 在行:1 字符:18 + 目录 |重命名项目

PPS:该文件确实存在:

PS D:\test> 目录 目录:D:\test 模式 LastWriteTime 长度 名称 ---- ------------- ------ ---- -a--- 2018 年 1 月 27 日下午 4:08 448 rb.bat -a--- 1/27/2018 3:04 PM 4 测试 [t].txt

当它在文件名中看到[ 时,PS 内部的某些东西将 PS 标头附加到路径是问题所在。如果我用((括号)替换[(括号),一切都会按预期工作。

【问题讨论】:

  • -replace 使用正则表达式。摆脱你的支架:'\['
  • 此外,如果您不需要,我会避免使用正则表达式。备选:$_.Name.Replace('[','_')
  • 仍然挂在表达式中的 [ - 或者如果它通过了,则无法找到原始文件;
  • PS D:\test> 目录 |重命名项目 -NewName{ $_.Name.Replace('[','')} 重命名项目:无法重命名,因为项目位于 'Microsoft.PowerShell.Core\FileSystem::D:\test\test [ t].txt' 不存在。在 line:1 char:18 + Dir | Rename-Item .Name.Replace('[','_')} + CategoryInfo : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException + FullyQualifiedErrorId : InvalidOperation,Microsoft .PowerShell.Commands.RenameItemCommand PS D:\test>
  • BECAUSE D:\test\test [t].txt DOES NOT EXIST. 阅读您的错误消息。

标签: powershell text replace


【解决方案1】:

转义字符是反斜杠。所以你的正则表达式模式应该是这样的:

Get-ChildItem | 
    Rename-Item -NewName {$_.Name -replace '\[|\]','_'}

这将替换左方括号和右方括号。

【讨论】:

  • 不起作用 ...PS D:\test> 目录 |重命名项目 -NewName { $_.Name -replace '[|]','' } 重命名项目:无法重命名,因为项目位于 'Microsoft.PowerShell.Core\FileSystem::D:\test\test [ t].txt' 不存在。在 line:1 char:18 + Dir | Rename-Item .Name -replace '[|]','_' } + CategoryInfo : InvalidOperation: (:) [Rename-Item], PSInvalidOperationException + FullyQualifiedErrorId : InvalidOperation,Microsoft .PowerShell.Commands.RenameItemCommand PS D:\test>
  • 你完全忽略了他的回答@GWild
  • 我在回答中完成了代码。它适用于我的环境
  • 当您将正则表达式/替换模式更改为以下内容时,您生成的文件名看起来会更好一些:'(\[|\]|\s)+','_'
  • 您能否按照我提供的方式至少尝试一次我在答案中提供的代码?
【解决方案2】:

是的,我看到你用蛮力解决了你的问题。此代码似乎可以生成您想要的文件名。

PS C:\src\t\renfunc> Get-ChildItem

    Directory: C:\src\t\renfunc

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-09-11     08:51              7 test [2].txt

PS C:\src\t\renfunc> Get-ChildItem | ForEach-Object { $_.Name -replace '\[|\]','_' }
test _2_.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 2014-09-14
    • 2013-05-03
    • 2019-02-10
    • 2019-05-11
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多