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