чтобы это работало без успеха. Я искал помощь здесь и в других местах и попробовал все, что мог придумать, проблема в том, что он выбирает дополнительный текст, я получаю ошибки в сценарии powershell, потому что имя файла содержит странные символы, которые являются системными символами.Я пытался получить
У меня есть несколько файлов, это обычные текстовые файлы. Вот конкретная строка текста, которую мне нужно выбрать и переименовать
"RECORDER ID: TEST1234 GROUP: TEST START TIME: 08/09/22 02:01"
После TEST1234
стоит несколько пробелов (например, десять или более пробелов)
Это 3-я строка txt в файле. Вторая строка текста пустая.
t, так что это правильное имя файлаВ настоящее время имя файла представляет собой строку цифр ".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
, но я не могу понять, как разделить i
$new_filename = $_.line -replace "RECORDER ID: (\w+).+", '$1.txt'
TEST1234
захватывается и повторно используется для замены содержимого строки, и таким образом становится значением $new_filename
.
Ваш код будет выглядеть так:Замените строку на новое имя va
$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
}