根据文件中的特定文本重命名文件,文件包含大量空格和其他文本

根据文件中的特定文本重命名文件,文件包含大量空格和其他文本

我一直试图让它工作,但没有成功。我在这里和其他地方搜索了帮助,并尝试了所有我能想到的方法,问题是它选择了额外的文本,然后我在 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
}

相关内容