在 powershell 中第一次出现连字符时删除所有文件名中的变量字符串

在 powershell 中第一次出现连字符时删除所有文件名中的变量字符串

如何在 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-'(必须用单引号引起来)。

相关内容