我一直试图让它工作,但没有成功。我在这里和其他地方搜索了帮助,并尝试了所有我能想到的方法,问题是它选择了额外的文本,然后我在 powershell 脚本中收到错误,因为文件名包含奇怪的字符,这些字符是系统字符。
我有多个文件,它们是纯文本文件。这是我需要从中选择并重命名的特定文本行
"RECORDER ID: TEST1234 GROUP: TEST START TIME: 08/09/22 02:01"
后面有多个空格TEST1234
(比如十个或更多空格)这是文件中 txt 的第 3 行。第 2 行文本是空白。
文件名目前是一串数字“.EU”,我想TEST1234.EU
根据上面的例子将文件重命名为“”。这是我尝试过的脚本
cd C:\temp
$files = [System.Collections.ArrayList]@()
select-string -Path "*.*" -Pattern "RECORDER ID:" | ForEach-Object {
$old_filename = $_.Filename
$new_filename = $_.line -replace "^.*RECORDER ID = ""","" -replace """.*$",""
$null = $files.Add(@{"old"=$old_filename;"new"=$new_filename})
}
$files |ForEach-Object{
$old_filename = $_.old
$new_filename = $_.new
rename-item $old_filename $new_filename -Force
}
$new_filename
最终包含整个模式字符串,我需要在之后的第一个空格后将其拆分TEST124
,但我不知道如何拆分它以便它成为一个有效的文件名
答案1
将新名称变量的行替换为以下内容:
$new_filename = $_.line -replace "RECORDER ID: (\w+).+", '$1.txt'
TEST1234
被捕获并重新使用来替换行内容,从而成为 $new_filename
的值。
您的代码将是:
$files = [System.Collections.ArrayList]@()
select-string -Path "*.*" -Pattern "RECORDER ID:" | ForEach-Object {
$old_filename = $_.Filename
$new_filename = $_.line -replace "RECORDER ID: (\w+).+", '$1,txt'
$files.Add(@{"old"=$old_filename;"new"=$new_filename})
}
$files |ForEach-Object{
$old_filename = $_.old
$new_filename = $_.new
rename-item $old_filename $new_filename -Force
}