web-dev-qa-db-ja.com

コマンドラインパラメータの改行をバッチファイルのWindows実行可能ファイルに渡すことはできますか?

たとえば、.batファイルからパラメータを渡したい実行可能ファイルがあります。キャッチは、パラメータ値にnewlineが含まれている必要があることです。

私が以下を試すとき:

"c:\folder\my app.exe" parameter="line1\nline2"

結果は、line1line2の間に改行があるとは解釈されません。

それを行う方法はありますか?

3
c00000fd

はい、できます。
小さなバッチファイルを使用して、\n変数を定義します。

@echo off

(set \n=^^^
%=empty, do not delete this line =%
^
%=empty, do not delete this line =%
)

myApp.exe Line1%\n%Line2

パラメータに引用符が含まれている場合でも機能します。
引用符はエスケープする必要があります。

myApp.exe parameter=^"aaa%\n%bbb^"

新しい行の定義は少し複雑に見えますが、それは キャレットの規則 によって引き起こされます

2
jeb

いいえ、バッチファイル自体ではありません。ただし、exeファイルまたは他のプログラムは、新しい行を含む引数を他のExeファイルに渡すことができます。

したがって、ここでの解決策は、次のように呼び出す引数を解析する簡単なツールを作成することです。

runner "c:\folder\my app.exe" parameter="line1\nline2"

そして、true LF文字(ここでは\nとして示されています)の代わりにを使用し、P/Invokeを使用して呼び出しを実行します。

"c:\folder\my app.exe" parameter="line1↵line2"

この制限を克服する別の方法は、PowerShellを使用することです。コマンドラインの解析が異なります。

1
miroxlav

できません。

Chown Unixコマンドがコロンを区切り文字として使用する理由と同様に、chownはユーザー名がコロンで終わると想定しています。同様に、バッチファイルにはファイル形式があります。

バッチファイルのファイル形式は、改行文字が行を終了することを前提としています。サポートされているエスケープシーケンスはありません。だから、あなたが求めていることはできません。

考えられる回避策の1つは、\ nの認識など、プログラムがエスケープシーケンスを認識するかどうかです。 (JScriptは、CScriptが使用できる.jsファイルとしてサポートされており、unescapeコマンドをサポートしています。WScript.Echo(unescape("%0d0a"));

これを処理するためのもう1つの一般的なアプローチは、プログラムがデータストリームをサポートする場合です。これは、指定されたファイル名または「標準入力」ストリームである可能性があります。改行文字/シーケンスは、その方法でプログラムに提供できます。

これらのアプローチは複数のプログラムで使用されます。私は、改行文字をバッチ無視する方法や、すべての/ほとんどのプログラムが参照しようとしている文字を認識するようにその文字をエンコードしようとする他の標準化された方法を思い起こしませんに。

0
TOOGAM