我有100个文件,例如:(没有引号)
" 管理和改善自己的学习[L3] {CBA849} "和
" 记笔记和笔记[L3] {CBA851} "
我想以这样的方式重命名它只显示" CBA849 "和" CBA851 "并删除任何其他内容。
我希望将文件代码保存在{......}大括号内。
我们有办法实现吗? (注意:它没有替换字符)
由于
答案 0 :(得分:2)
Rename-Item -LiteralPath $path ([regex]::match($path, '{(.+)}')).Groups[1].Value
[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))
一旦你在$ f中有了文件对象,脚本就会这样做: