Execute um comando do PowerShell em lote

Execute um comando do PowerShell em lote

Preciso dividir uma linha muito longa em um arquivo de texto (talvez centenas de milhares de caracteres) em linhas mais curtas (8.184 caracteres) e .batnão consigo realizar essa tarefa.

No entanto, encontrei uma solução PowerShell (aqui):

(gc in.txt) -replace ".{750}" , "$&`r`n" | sc out.txt

Isso funciona quando abro a janela do PowerShell e colo a versão ligeiramente ajustada, onde 750está 8184e a executo, MAS ao incluí-la no meu .batassim...:

powershell -Command "(gc test.txt) -replace '.{8184}' , '$&`r`n' | sc temp.txt"

... não funciona como esperado e insere ...

`r`n

... após cada 8184 caracteres (não consigo formatar isso em linha, desculpe).


Eu tentei fazer uso de:

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"

Mas não consigo fazer funcionar. Qual é o problema aqui?

Responder1

`r`né a sequência de escape correta para uma nova linha, mas o problema é que as strings entre aspas simples não fazem a avaliação da sequência de escape ou a interpolação de variável que as strings entre aspas duplas fazem, portanto, a sequência de escape literal termina em sua saída. Precisamos passar a string para o PowerShell entre aspas duplas, o que é um tanto complicado, pois cmd.exetambém temos que lidar com a interpretação de '. Usar quatro aspas duplas por aspas duplas compreendidas resolve o problema:

powershell -Command "(gc test.txt) -replace '.{8184}' , """"$&`r`n"""" | sc temp.txt"

informação relacionada