![在 powershell 中第一次出现连字符时删除所有文件名中的变量字符串](https://linux22.com/image/1581681/%E5%9C%A8%20powershell%20%E4%B8%AD%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%87%BA%E7%8E%B0%E8%BF%9E%E5%AD%97%E7%AC%A6%E6%97%B6%E5%88%A0%E9%99%A4%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E7%9A%84%E5%8F%98%E9%87%8F%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
如何在 PowerShell 中删除所有文件名中的变量字符串,直到第一次出现连字符?
我在同一个文件夹中有一个文件列表,例如:
图片_1_2017-01-02_abc.jpg 图片_10_2017-01-03_dfc.jpg 图片_111_2017-01-04_sdfc.jpg 图片_20_2017-01-05_gh.jpg 图片_354_2017-01-06_asfd.jpg ...
我想替换所有内容,直到第一个“连字符“ 经过 ”2017例如,要替换“图片_10_2017“ 经过 ”2017“并保留名称的其余部分以接收下一个文件列表:
2017-01-02_abc.jpg
2017-01-03_dfc.jpg
2017-01-04_sdfc.jpg
2017-01-05_gh.jpg
2017-01-06_asfd.jpg
我怎样才能在 Windows 中使用 PowerShell 或任何其他工具来做到这一点?
答案1
从这个先前的问题,批量重命名文件的总体结构为:
Get-ChildItem <glob> | foreach { Rename-Item $_ <newname> }
每个项目都有其原始名称存储在中$_.Name
,当常规固定字符串 .Replace() 方法不够用时,请使用正则表达式。
在 PowerShell 中,您可以通过两种方式访问基于正则表达式的 Replace():
[regex]::Replace($str, $regex, $replacement)
$str -replace $regex, $replacement
只需删除前缀
正则表达式^picture_\d+_
将匹配不需要的前缀;用空值替换它。
两者结合后:
Get-ChildItem *.jpg | % { Rename-Item $_ ([regex]::Replace($_.Name, "^picture_\d+_", "")) }
Get-ChildItem *.jpg | % { Rename-Item $_ ($_.Name -replace "^picture_\d+_", "") }
或者,为了匹配问题,^[^-]*-
将匹配所有内容直到(包括)第一个破折号;将其替换为"2017-"
(假设所有文件都来自同一年 - 否则您可能会意外丢失信息)。
替换部分原件
您可以使用匹配原始文本的一部分( )
并将其用作替换$1
($2、$3...)。这将在您的情况下产生相同的最终结果,但更接近您最初要求的结果。
例如,正则表达式"^picture_\d+_(\d+)-"
和替换'$1-'
(必须用单引号引起来)。