使用powershell从文件名中删除一些字符

时间:2014-07-23 15:49:19

标签: file powershell rename

我有100个文件,例如:(没有引号)

" 管理和改善自己的学习[L3] {CBA849} "和

" 记笔记和笔记[L3] {CBA851} "

我想以这样的方式重命名它只显示" CBA849 "和" CBA851 "并删除任何其他内容。

我希望将文件代码保存在{......}大括号内。

我们有办法实现吗? (注意:它没有替换字符)

由于

3 个答案:

答案 0 :(得分:2)

Rename-Item -LiteralPath $path ([regex]::match($path, '{(.+)}')).Groups[1].Value
  • 您需要 -LiteralPath ,因为文件名包含括号。
  • [regex]::match($path, '{(.+)}')匹配花括号及其内容,并将内容捕获到匹配组中。 .Groups[1].Value返回第一个(在这种情况下,唯一的)匹配组的值。
  • 这假定所有文件都以问题中显示的格式命名。如果名称中的其他位置可能存在大括号,请将正则表达式{(.+)}更改为{(.+?)}$

答案 1 :(得分:1)

我个人使用正则表达式匹配:

GCI $path | ?{$_.Name -match "(?:.*?{)(.*?)(?:})(\..*)?$"}|%{$_.MoveTo("$($_.Directory)\$($matches[1])$($matches[2])")}

编辑:正如Adi Inbar所说,我创建了一个过于复杂的RegEx模式。他建议的简化(虽然仍然允许扩展)是修改后的答案:

GCI $path | ?{$_.BaseName -match "{(.*?)}$"}|%{$_.MoveTo("$($_.Directory)\$($matches[1])$($_.Extension)")}

编辑:好的,这是故障......

GCI是Get-ChildItem的缩写,它提取了指定目录的列表,但我想你可能已经找到了一个。

然后它管道到Where {}子句(?是Where的别名)。它匹配GCI命令提供的文件和文件夹的BaseName。 BaseName属性实际上是PowerShell生成的一个属性,它取名文件,扩展名和all,然后从中删除扩展名(前一个句点),如果文件名是 Sample.txt 那么它为您提供 Sample 作为BaseName。

它与RegEx(正则表达式的缩写)模式匹配。如果您不知道RegEx是什么,请随时查阅并阅读(Google是您的朋友)。基础是它匹配模式而不是实际文本。在这种情况下,模式是文件名末尾的任何位于花括号之间的东西。

过去它进入ForEach循环(我使用ForEach的%别名)。对于与RegEx模式匹配的每个文件,它为该文件执行MoveTo()方法。它移动到的位置是该文件的当前目录(使用$ .Directory获取),后跟反斜杠,然后是$ Matches [1](我将在一秒内完成),然后文件的原始扩展名(使用$ .Extension获得)。现在,您将看到我将目录和扩展包装在子表达式$()中,因为如果您尝试指定变量的属性,则使用字符串外推(如果将变量置于双引号内,它将如何自动扩展变量)必须把它放在一个子表达式中。否则它会尝试仅展开变量本身,并以纯文本显示.Whatever属性名称。

最后,$ Matches是一个自动变量,当你与一些东西匹配时填充(例如我们在Where子句中所做的<something> -match <something else>)。它的第一个记录是匹配<something>的整个字符串,然后下一个记录是基于<something else>的匹配。

我希望能为你清除一切。如果您有具体问题,请告诉我。如果此答案解决了您的问题,请将其标记为已接受。

答案 2 :(得分:0)

$f=gi $filepath;
$f.MoveTo($f.fullname.Replace($f.name,$f.name.substring($f.name.indexof("{")+1,($f.name.indexof("}")-1)-$f.name.indexof("{"))+$f.extension))
  1. 使用get-item(gi)获取您希望重命名为[System.IO.FileInfo]对象的文件。
  2. 一旦你在$ f中有了文件对象,脚本就会这样做:

    • MoveTo
    • $ f.FullName:现有文件的完整路径(C:\ some \ dir \ Test {ABC123} .txt)
    • 使用Replace函数将FullName修改为新文件名,将旧文件名($ f.name)替换为所需名称
      • 文件名的子串函数将允许您只获取花括号之间的字符串。
        • 在名称字符串
        • 中查找OpenCurlyBracket的索引
        • 在名称字符串
        • 中查找CloseCurlyBracket的索引
      • 使用Substring函数识别花括号之间的文本后,将文件扩展名附加到新文件名