Мне нужно разбить очень длинную строку в текстовом файле (возможно, сотни тысяч символов) на более короткие строки (8184 символа), и a .bat
не может справиться с этой задачей.
Однако я нашел решение PowerShell (здесь):
(gc in.txt) -replace ".{750}" , "$&`r`n" | sc out.txt
Это работает, когда я открываю окно PowerShell и вставляю слегка измененную версию, куда 750
и 8184
выполняю ее, НО когда я включаю ее в свой .bat
код, вот так ...:
powershell -Command "(gc test.txt) -replace '.{8184}' , '$&`r`n' | sc temp.txt"
... он не работает так, как задумано, и вставляет ...
`r`n
... после каждого 8184-го символа (я не могу отформатировать это строкой, извините).
Я попытался использовать:
powershell -Command "& {(gc test.txt) -replace '.{8184}' , '$&`r`n' | sc temp.txt}"
powershell -Command "(gc test.txt) -replace '.{8184}' , '$&\r\n' | sc temp.txt"
powershell -Command "(gc test.txt) -replace '.{8184}' , '$&VbCrLf' | sc temp.txt"
Но у меня не получается. В чем тут проблема?
решение1
`r`n
является правильной escape-последовательностью для новой строки, но проблема в том, что строки в одинарных кавычках не выполняют оценку escape-последовательности или интерполяцию переменных, как строки в двойных кавычках, поэтому в вашем выводе оказывается буквальная escape-последовательность. Нам нужно передать строку в PowerShell в двойных кавычках, что довольно сложно, поскольку нам cmd.exe
также приходится иметь дело с интерпретацией . Использование четырех двойных кавычек на каждую понятную двойную кавычку делает эту работу:
powershell -Command "(gc test.txt) -replace '.{8184}' , """"$&`r`n"""" | sc temp.txt"