如何用字符串替换文件名中的第一个字符?

时间:2017-12-12 19:30:57

标签: powershell scripting

我一直在编写一个脚本来维护我的IP摄像机DVR的存档。我的录音软件输出格式化的文件名,以便第一个字符是摄像机编号,后跟日期和时间戳。

离。 1_2017-11-03_00-45-07.avi

我想用代表相机的字符串替换第一个字符。

离。 DivertCam_2017-11-03_00-45-07.avi

到目前为止,我有:

Get-ChildItem  "D:\DivertCam\1_*.avi" |
    Rename-Item -NewName {$_.Name -replace '1_?','DivertCam_'}

幸运的是-WhatIf并运行成绩单,我能够看到我的结果是错误的:

  

如果:执行操作"重命名文件"目标"项目:D:\ DivertCam \ 1_2017-11-03_00-45-07.avi目的地:D:\ DivertCam \ DivertCam_20DivertCam_7-DivertCam_DivertCam_-03_00-45-07.avi"

我知道它只是挑选出每一个" 1 _"。如何在" 1 _"的第一个实例之后创建它,或者像字符串一样读取文件名,将其拆分为由" _"分隔的3个数组。然后更改第一个数组?

2 个答案:

答案 0 :(得分:3)

-replace运算符执行RegEx匹配和替换,因此您可以使用RegEx语法执行所需操作。对于您而言,解决方案是在匹配文本的开头包含“字符串开头”字符^。由于这是RegEx,?表示前一个字符可能存在,也可能不存在,因此您当前匹配的是任何匹配“1”的字符,可能会或可能不会跟随下划线。更好的版本只是:

$_.name -replace '^1','DivertCam'

要将其与您的其余部分放在上下文中,它将是:

Get-ChildItem  "D:\DivertCam\1_*.avi" | Rename-Item -NewName {$_.name -replace '^1','DivertCam'}

请记住,这仅适用于-replace运算符,它使用RegEx(正则表达式的缩写)匹配,而不是您可能会看到的使用简单模式匹配的.Replace()方法。< / p>

答案 1 :(得分:0)

这将取代第一个&#39; _&#39;之前的所有内容。与&#39; DivertCam&#39; (注意使用%(foreach)单独操作每个文件。)

Get-ChildItem "D:\DivertCam\1_*.avi" | % {Rename-Item $_.FullName -NewName "DivertCam$($_.Name.Substring($_.Name.IndexOf('_')))" }