編集可能

.NET Frameworkでコマンドラインパラメータを取得するときの挙動がおかしい希ガス

ちょっとコマンドラインにパス名を渡すという処理を作っていて、"D:\"のようにルートフォルダを指定したら受け取った値がおかしいんだぜ!とつぶやいたら、どうも.NETは関係なくてWindowsのコマンドライン処理が複雑怪奇すぎるためじゃないか、という話。
cmd.exe ダブルクォート .NET コマンドライン
7
ぽぴ王子(秘) @PrincePOPI_
気づいたんだけど、.NETで、コマンドラインパラメータに "a\" みたいに最後に \ が入った文字列をダブルクォートで囲んで渡すと、Environment.GetCommandLineArgs の結果が a" みたいになって返ってくるんだけど、これってバグだよね?
ぽぴ王子(秘) @PrincePOPI_
@hatsune_ 自分の環境はC#です。Environment.CommandLine は問題なかったので、GetCommandLineArgs のバグなのかな?
ぽぴ王子(秘) @PrincePOPI_
@filemente えー、 "a\" だったら a\ が返ってきてほしいじゃないですか.
小野 修司 @onos
@PrincePOPI \がエスケープ文字として扱われてて、\" で "を指定してる、と見てるんだろね。そういう意味では文字列を閉じてないあつかいにならずに処理しちゃってるのが問題といえば問題かな。
ぽぴ王子(秘) @PrincePOPI_
@onos たぶんそうなんだと思います。 "a\b\c\" みたいに途中に \ が入っている場合は a\b\c" って取れるんですよね。
小野 修司 @onos
@PrincePOPI でも文字列の解析処理としては通常の動きだと思う。\はエスケープ文字だからね。
ぽぴ王子(秘) @PrincePOPI_
@onos うーむ、バグとは言い切れない、って感じでしょうか。俺「バグじゃねえの?」 ゲイツ「仕様です!(キリッ」 みたいな。
Akira Hatsune @hatsune_
@PrincePOPI "a""になりますね。"をエスケープしちゃってる?
ぽぴ王子(秘) @PrincePOPI_
とりあえず最後が \ で終わっていたら \\ にするというadhocな対応で逃げることにする
Akira Hatsune @hatsune_
.@PrincePOPI @onos 「"a\" popi」といれたら「"a" popi"」になりました。「」は除く。
小野 修司 @onos
@PrincePOPI んー、正確には文字列中の\はすべて\\に変換する、が正しい処理じゃないかと思う。
小野 修司 @onos
@hatsune_ @PrincePOPI たぶん\tってはいってたら意図しない動きするよね。これタブ文字扱いのはず。
小野 修司 @onos
@PrincePOPI @hatsune_ \rや\nも。なので\を文字列中で使いたいなら一度\\に変換すべきかと。
ぽぴ王子(秘) @PrincePOPI_
なるほど。そういう方向でやってみます QT @onos: @PrincePOPI @hatsune_ \rや\nも。なので\を文字列中で使いたいなら一度\\に変換すべきかと。
Akira Hatsune @hatsune_
.@onos @PrincePOPI これコマンドライン引数として意図的にUnixっぽいエスケープシーケンスになるようにしてるんじゃ?
Akira Hatsune @hatsune_
.@onos @PrincePOPI コマンドライン引数を指定するときのお約束にしちゃえばいいような。。。
ぽぴ王子(秘) @PrincePOPI_
ぐは。 "\\t\\r\\n\\" ってやったら \\t\\r\\n\ になった。純粋に最後の文字だけおかしいwwww
小野 修司 @onos
あら。。。それはたしかにおかしい(w RT @PrincePOPI: ぐは。 "\\t\\r\\n\\" ってやったら \\t\\r\\n\ になった。純粋に最後の文字だけおかしいwwww
このツイートは権利者によって削除されています。
ちゃちゃき @chachaki
ぽぴ王子が言ってるやつ、半年前ぐらいのブクマに合ったなー。windowsの複雑怪奇な文字列処理。
残りを読む(8)

コメント

ぽぴ王子(秘) @PrincePOPI_ 2010年9月23日
デコレーションしました
kartis56 @kartis56 2010年9月24日
MS-DOSのころからそう言う仕様だったと思う。詳細はDOSのマニュアル見れば書いてあるはず。 2chの過去スレを漁ると、もっとややこしいことやっててうんざりできます。 http://www.unkar.org/read/pc12.2ch.net/win/1243134619 とか。
まさゃん(17) @DrFaust 2010年11月3日
確かコマンドラインのパースって、DOSの場合、シェルじゃなくて実行ファイル(にリンクされてるコード)自体がやってるんじゃなかったっけかな… 仮にそうだとした場合、そこを自前で用意してやればいい。
ログインして広告を非表示にする
ログインして広告を非表示にする