[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[connect24h:10676] Re: WIN にて古いファイルを削除
- To: connect24h@xxxxxxxxxx
- Subject: [connect24h:10676] Re: WIN にて古いファイルを削除
- From: Tomoki Sanaki <sanaki@xxxxxxxxxxxx>
- Date: Thu, 30 Mar 2006 11:07:19 +0900
佐名木という者です。
Tietew wrote on 2006-3/24(金) 13:10:39
>WindowsのコマンドプロンプトというかMS-DOSの時代から,二重引用符
>とか関係なくコマンドライン「文字列」としてプログラムに渡します。
>
>二重引用符を一個の引数と解釈するかどうかは実は起動されたプログラ
>ムにかかっています。
VB6 の場合、
command という変数?関数?に上記のように一括して埋め込まれますので、
自分(VBプログラマ)で、区分けしなきゃならんです。
面倒です!
>ふつうにCライブラリを使っていれば二重引用符と,その中の \" エス
>ケープだけ認識しますが。
C の場合
======argv.c======
#include <stdio.h>
int main(int argc,char* argv[]){
int i;
for(i=0;i<argc;i++){
printf("%d : %s\n",i,argv[i]);
}
return 0;
}
==================
なプログラムをコンパイルしてみると、
C:\>argv a b c
0 : argv
1 : a
2 : b
3 : c
C:\>argv "a b" c
0 : argv
1 : a b
2 : c
C:\>argv a^|b c
0 : argv
1 : a|b
2 : c
C:\>argv "a \"b" c
0 : argv
1 : a "b
2 : c
C:\>argv "a \\\"b" c
0 : argv
1 : a \"b
2 : c
C:\>argv a\ b c
0 : argv
1 : a\
2 : b
3 : c
ってな感じになります。
私が思うのは「^」がエスケープ文字なのに(Helpに書いてあります)
「 (半角スペース)」があれば「"」で囲んで
さらに「"」のエスケープが「\」であるのか。
という摩訶不思議なエスケープルールに疑問です。
(Windows の cmd.exe と UNIX 系シェルでは異なるということを)
(OS Command インジェクションする時には注意しましょう! [冗談ですよ])
また、batファイルでも試してみました。
======argv.bat====
@ECHO OFF
:ST
IF "%1"=="" GOTO FIN
ECHO %1
SHIFT
GOTO ST
:FIN
==================
C:\>argv.bat a b c
a
b
c
C:\>argv.bat "a b" c
b""=="" の使い方が誤っています。
C:\>argv.bat a^|b c
'b' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
C:\>argv.bat a^^^|b c
a|b
c
C:\>argv.bat a\\\|b c
'b' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
ってな感じになって、バッチファイル内部のエスケープを考えないといけないのが
面倒になりましたので、
======argv2.bat===
@ECHO OFF
ECHO %1
ECHO %2
ECHO %3
==================
C:\>argv2.bat a b c
a
b
c
C:\>argv2.bat "a b" c
"a b"
c
ECHO は <OFF> です。
C:\>argv2.bat a^|b c
'b' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
C:\>argv2.bat a^^^|b c
a|b
c
ECHO は <OFF> です。
となります。
さて、WSH & VBScript でもやってみましょうか
======argv.vbs====
Option Explicit
Dim ArgsObj
Dim Count
Dim i
Set ArgsObj = Wscript.Arguments
Count = ArgsObj.Count
For i=0 To Count-1
Wscript.Echo ArgsObj(i)
Next
==================
C:\>cscript //NoLogo argv.vbs a b c
a
b
c
C:\>cscript //NoLogo argv.vbs "a b" c
a b
c
C:\>cscript //NoLogo argv.vbs a^|b c
a|b
c
C:\>cscript //NoLogo argv.vbs a\|b c
'b' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
C:\>cscript //NoLogo argv.vbs "a \"b" c
a \b c
おっ!!
C:\>cscript //NoLogo argv.vbs "a ""b" c
a b
c
うん!?
となります。
全体を通して、はっきりいってグチャグチャです。
Delphi の場合.....以下、書けないので略...orz
自分のプログラム開発環境では、どんな挙動をするかテストしてみると
いいと思います。
================
結論
基本的に Windows (Winプログラマの視点ですが)は
「"」で囲んだものは一つにしてくれて、プログラムに渡すようだ。
一方で UNIX 系も csh 系と sh 系で微妙に挙動が異なりますね♪
(なんのために調べ上げたんだろう、おいら ^^)
以上、よろしくお願いします
-----------------------------------------------------
佐名木 智貴(Tomoki Sanaki)
E-mail=active@xxxxxxxxxxxxxxxxxx
PGP FingerPrint
= 34E5 2A31 45C8 2CB5 3CED 0B46 F328 A402 7182 DCC6
--[PR]------------------------------------------------------------------
オリンピック銀メダリストシンクロナイズドスイマーの藤井来夏さんご愛用♪
一時は鏡を見るのも嫌になる位肌がボロボロだったそうですが今ではそれが信
じられない程しっとりとしたキメ細かいお肌に♪この驚きの透明肌の正体は天
然ビタミンCカムカムエキス配合の化粧品だから。お得なトライアルセット有
http://ad.freeml.com/cgi-bin/ad.cgi?id=dTL8W
------------------------------------------------------------------[PR]--
■GMO INTERNET GROUP■ GMO INTERNET www.gmo.jp