バッチからPowerShellコマンドを実行する

バッチからPowerShellコマンドを実行する

テキスト ファイル内の非常に長い行 (おそらく数十万文字) を短い行 (8184 文字) に分割する必要がありますが、.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は改行の正しいエスケープ シーケンスですが、問題は、一重引用符で囲まれた文字列は、二重引用符で囲まれた文字列のようにエスケープ シーケンスの評価や変数の補間を行わないため、出力にリテラル エスケープ シーケンスが残ってしまうことです。文字列を二重引用符で囲んで PowerShell に渡す必要がありますが、cmd.exeの解釈も処理する必要があるため、これはやや面倒です。理解できる二重引用符ごとに 4 つの二重引用符を使用すると、うまくいきます。

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

関連情報