我一直在编写一个脚本来维护我的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个数组。然后更改第一个数组?
答案 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('_')))" }