2017-11-15 25 views
0

QB64のコマンドラインを解析するプログラムがあります。 COMMAND $関数 は、コマンドラインを返します。私は、 スペースを含むファイル名とは異なるように、引用符内からパースしてスペースを含む可能性のある長いファイル名を解析する必要があります。たとえば、 "long filename.ext"QB64のコマンドラインに三重引用符が必要です

コマンドラインに引用符がない場合、コマンド$は、引用符で囲んだ場合はファイル名を "filename"、 ""とすると を返しますfilename ""は両方ともfilenameを返します。しかし、 "" "filename" ""は引用符で囲まれた ファイル名を返します。別の方法でコマンド$ $に引用文を送信できますか?

答えて

1

QB64は、C++でargvargcから—ほとんど類似COMMAND$_COMMANDCOUNT機能を提供します。 COMMAND$が引数なしであれば、すべてのコマンドライン引数を含む単一の文字列が返されますが、COMMAND$(i)はインデックスiの引数を文字列として取り出すこともできます。 QB64 Wikiに_COMMANDCOUNT entryから例:

limit = _COMMANDCOUNT 
FOR i = 1 TO limit 
    PRINT COMMAND$(i) 
NEXT 

あなたはQB64でコマンドライン引数を扱うためにそれらを使用すると思います。プログラムに引用符を含むコマンドライン引数を渡す場合は、バックスラッシュを使用して引用符をエスケープする必要があります。

残念ながら、バックスラッシュのエスケープは完全ではなく、主にバックスラッシュがファイルパスで使用されているため、cmd.exeで問題を引き起こす可能性があります。これをファイルパスのスペースと組み合わせると、悪夢のコマンドインタープリタができます。 this answerからは、あなたがプログラムに適切な引用符を渡すために引用符で囲まれた文字列内の引用符を倍増:ワインのcmd.exe

> program.exe hello world 
hello 
world 

> program.exe hello"" world 
hello (+ empty quoted string) 
world 

> program.exe "hello"" world 
hello" 
world 

> program.exe "hello""" world 
hello" world 

""はそうすぐに連続した引用は、上記のように引用も引用符で囲まれた文字列を閉じエスケープ次の間隔のある項目を現在の引数でグループ化し続ける必要がありました。私はWindowsマシンを実行していないので、Windowsの実装についてはわかりませんが、同じ動作が発生する可能性があります。言い換えれば

、あなたは"""filename"""を渡す理由:

"  Open quoted string 
""  Escaped double quote, closes quoted string 
filename Concatenated at the end of the first quoted string 
"  Open quoted string, concatenated to filename 
""  Escaped double quote, closes quoted string 

編集

あなたは引用符で囲まれた文字列の^"外を使用することができ、それは例えば"""^"結果として、独自の問題を持っています、ちょうど"""のように。 ""^"をバッチファイルに渡すには、余分なエスケープを""^^"とする必要があります。したがって、^を使用することはお勧めできません。特に"""""の場合は特に問題ありません。 ^エスケープ文字に関する情報については、上記のリンク先の答えをご覧ください。

また、バックスラッシュと引用符で囲まれた文字列にも注意する必要があります。あなたのプログラムに1つの引数として、Unixライクな引数'C:/Program Files/"file" name'の適切なWindowsの表現を渡すかもしれない方法を考えてみましょう:

> program.exe "C:\Program Files\\""file\"" name" 
C:\Program Files\"file" name 

cmd.exe説明:これは"C:\Program Files\\"file\" name"のコマンドラインになり

"     Open quoted string 
C:\Program Files\\ Quoted string contents, including escaped \ 
""     Escaped double quote, closes quoted string 
file\    Unquoted string contents, including C escape char 
""     Open quoted string with escaped double quote 
[ ]name    Quoted string contents 
"     Close quoted string 

プログラムに渡され、その結果、パスはC:\Program Files\"file" nameになります。もちろん、このようなパスはWindowsでは不可能です(そして、NTFSファイルシステムではないかもしれません)が、それはその点を示しています。cmd.exeの引用規則とCランタイムの引用規則とバックスラッシュエスケープ。

+0

私は、引用符をエスケープすると思っていましたが、それはバックスラッシュです。 – eoredson

+1

バッチファイルでは、 '^" 'を使用できますが、インタラクティブセッションでは、引用符で囲まれた文字列を引用符で囲んで終了するには '' ''(引用符で囲まれた文字列を開始/終了する)または '' "' '(引用符で囲まれた文字列を終了して引用符で囲まれた文字列を開始する)引用符に関するさまざまなエスケープ規則について私はまたバックスラッシュのエスケープや二重引用符に関するいくつかのことを明確にするために私の答えを編集しました。 WSL bash、git-bash、またはCygwinやMSYSのbashバージョンのいずれであっても理想的です。 –

関連する問題