Ejecutar un comando de PowerShell desde un lote

Ejecutar un comando de PowerShell desde un lote

Necesito dividir una línea muy larga en un archivo de texto (tal vez cientos de miles de caracteres) en líneas más cortas (8184 caracteres) y .batno puedo realizar esta tarea.

Sin embargo, encontré una solución PowerShell (aquí):

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

Esto funciona cuando abro la ventana de PowerShell y pego la versión ligeramente ajustada, donde 750está 8184y la ejecuto, PERO cuando la incluyo en mi.bat así...:

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

... no funciona como estaba previsto y se inserta...

`r`n

... después de cada carácter 8184 (no puedo formatear esto en línea, lo siento).


Intenté hacer 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"

Pero no puedo hacerlo funcionar. ¿Cuál es el problema aquí?

Respuesta1

`r`nes la secuencia de escape correcta para una nueva línea, pero el problema es que las cadenas entre comillas simples no realizan la evaluación de la secuencia de escape o la interpolación variable que hacen las cadenas entre comillas dobles, por lo que la secuencia de escape literal termina en su salida. Necesitamos pasar la cadena a PowerShell entre comillas dobles, lo cual es algo complicado ya que cmd.exetambién tenemos que lidiar con la interpretación de. Usar cuatro comillas dobles por cada comilla doble entendida hace el trabajo:

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

información relacionada