Я использую .baat для перемещения нескольких файлов в другую папку, но перед фактической частью перемещения я хочу заменить LAST-строку (это известная линия), например, у меня есть файл output.txt, как это:Используя PowerShell в файле .bat, замените строку несколькими строками
HEADER BODY FOOTER
Используя этот фрагмент кода:
powershell -Command "(gc output.txt) -replace 'FOOTER', 'ONE_MORE_LINE `r`n FOOTER' | Out-File output.txt"
возвращение, что я ожидал был
HEADER BODY ONE_MORE_LINE FOOTER
Но что я был:
HEADER BODY ONE_MORE_LINE `r`n FOOTER
Я пробовал:
\n
<br>
"`r`n"
"`n"
echo ONE_MORE_LINE >> output.txt; echo. >> output.txt; echo FOOTER >> output.txt"
Этот последний был близок, но результатом были некоторые сломанные персонажи.
Другие предложения, кроме PowerShell, приветствуются. Я использую его только потому, что было легко получить добавление линий и заменить его.
EDIT: Пробовал эту команду
powershell -Command "(gc output.txt) -replace 'FOOTER;', ""ONE_MORE_LINE `r`n FOOTER"" | Out-File output.txt "
И возвращается сообщение об ошибке:
A cadeia de caracteres não tem o terminador: ". + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
edit2 - возможное решение:
Я понял, что с помощью команды PowerShell изменил кодировку файл, взломав echo ONE_MORE_LINE
, и используя предложение от @AnsgarWiechers, я сделал этот код
findstr /v "FOOTER" output.sql > new_output.sql
TYPE new_output.sql > output.sql
del new_output.sql
ECHO. >> %%f
ECHO ONE_MORE_LINE >> %%f
ECHO FOOTER >> %%f
ECHO. >> %%f
Что она делает это с помощью commant findstr /v
«Footer» я смотрю на все линии, которые не FOOTER в файле output.sql и записать его на new_output.sql
Тогда я TYPE
его обратно исходный файл и DEL
new_output.sql
Тогда я Echo
все строки, которые мне нужны прямо под ним.
Это работает, но для больших файлов я думаю, что повторная запись его дважды займет много времени, но я не могу понять другое решение.
PowerShell не расширяет escape-последовательности в одиночных кавычках. Вы должны использовать там строку с двумя кавычками. Дважды вложенные двойные кавычки, чтобы избежать их для CMD: '' powershell -Command '(...) -replace' FOOTER ', "ONE_MORE_LINE' r'n FOOTER "" | ... "' ' –
Вы могли бы сделать это в чистой партии с командой 'FOR/F'. Вы просто держите предыдущую строку в переменной. Когда следующая строка будет прочитана, выпишите предыдущую строку. Когда команда 'FOR' будет выполнена, выпишите свою вторую в последнюю строку, а затем свою последнюю строку, которая будет удерживаться в предыдущей переменной. – Squashman
@AnsgarWiechers - Когда я удвоил вложенные двойные кавычки, он возвратил ошибку, сказав, что цепочка символов не имеет конца. – Websis