HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0611
GrapeColor(DION)コマンドラインの処理18解決


GrapeColor(DION)

リンク

2012/6/11(Mon) 00:51:26|NO.47162

コマンドラインでファイルパスを取得するとき、様々な形式があり自分の屑な脳みそでは処理方法が思いつきません。
どんな形式でも処理できる方法を教えてください。



この記事に返信する


check

リンク

2012/6/11(Mon) 01:05:56|NO.47163

getpath命令あたりで相対パスから絶対パスを取得すればとしか言いようが。
さまざまな形式って一体どんな形式を前提としているんだよ。
こちらが受け付けないものは弾くって言うのも1つの手だ。



GrapeColor(DION)

リンク

2012/6/11(Mon) 01:42:54|NO.47166

getpath・・・相対パス・・・?
なぜそんな単語が出てくるのか分かりかねますが、恐らく私の説明不足です。

コマンドラインに
C:\WINDOWS\explorer.exe

"C:\Program Files\Internet Explorer\iexplore.exe"

"C:\Program Files\Internet Explorer\iexplore.exe"

"C:\WINDOWS\explorer.exe" "C:\WINDOWS\notepad.exe" "C:\WINDOWS\regedit.exe"
などと言った形式が前提です。
これ以外にも種類があるのかもしれませんが、私はこれ以外知りません。
この色んな形式に対応するにはどうすれば良いでしょうか。



GrapeColor(DION)

リンク

2012/6/11(Mon) 01:45:49|NO.47168

>こちらが受け付けないものは弾くって言うのも1つの手だ
これは一番やりたくないです。
開発者の都合でユーザーが不便な思いをするなんて私は我慢できません。
これ以外の方法でお願いします。



晩御飯

リンク

2012/6/11(Mon) 01:57:38|NO.47170

質問者の都合で回答者が不便な思いをするなんて私は我慢できません。

は冗談として
一体どんな処理をしたいのかさっぱりわからないのだけれど
パスの加工をしたいだけなら私でもstrmidとかgetpathとか使えと答えるし



ヂオン

リンク

2012/6/11(Mon) 04:45:35|NO.47172

推測ですが。

instr等 で "(ダブルクオーテーション) が有るか否かを検索して 有ったらテキスト処理
で良いのではないでしょうか?

下は、ダブルクォーテーションの間にある文字列を列挙するプログラムです。


tx = "\"C:\\WINDOWS\\explorer.exe\" \"C:\\WINDOWS\\notepad.exe\" \"C:\\WINDOWS\\regedit.exe\"" #define global ctype IsWchar(%1) ((%1>=129 & %1<=159) or (%1>=224 & %1<=252)) is_indq=0 repeat strlen(tx) w = wpeek(tx,cnt) c = w&0xFF size= (IsWchar(c) or (w==0x0a0d) ) + 1 if(c=='"'){ is_indq ^= 1 if(is_indq){ tgt = cnt+size }else{ mes strmid(tx,tgt,cnt-tgt) } } continue cnt+size loop



skyblue

リンク

2012/6/11(Mon) 18:30:45|NO.47183

>getpath・・・相対パス・・・?
>なぜそんな単語が出てくるのか分かりかねますが、恐らく私の説明不足です。
コマンドラインでのパスの指定の方法には
絶対パスと相対パスというファイルのパスの指定方法があります。
絶対パスというのはドライブ名からフォルダ名やファイル名までを
すべて指定する方法であり、質問者さんが言っているのはすべて絶対パスです。
相対パスというのは現在のディレクトリ(基本実行ファイルのある場所)から
目的のファイルやフォルダの場所を指定する方法です。
ダブルクォーテーションは空白がパスの中に入っている「Program Files」などの
場所やファイルの場合だけ必須なものです。
getpathというのはフォルダだけ、拡張子なしファイル名、拡張子のみなどに
変換してくれるものです。(HSP)



GrapeColor(DION)

リンク

2012/6/11(Mon) 20:33:31|NO.47197

一身上の都合でイライラして当たり気味の態度をとってしまいました
申し訳無いです

>>晩御飯
人の信念を小馬鹿にするのはやめてください
と言っても無駄なのは分かってますはい

私が考えている加工後の状態は、ファイルそれぞれの絶対パスが改行されて変数に格納されている状態が理想です。
ヂオンさんの回答が一番近いのですが、コマンドラインに代入されるファイルパスのパターンが多すぎてヂオンさんの方法でも難しいです。
一応自分が知ってる代入のパターンをまとめます。

ファイルパスにスペースが含まれていなければそのまま代入される。
スペースがあればファイルパスの両端にダブルクオーテーションが付けられる。
複数ファイルがある場合は、それぞれのファイルパスがスペースで区切られて代入される。
関連付けでコマンドラインが代入された場合は一番最初にスペースが付加されて代入される。

と言った感じです・・・。
これを上手く処理できる方法はありませんか。

多分、私が書いてる文章に苛立つ方もいらっしゃるかもしれませんが、どうかお付き合いください。



たんす

リンク

2012/6/11(Mon) 21:06:40|NO.47202

splitで「”」ごとに区切れば良いのではないですか?
Cmdline="\"c:\\_test test\" \"d:\\move\\\""	;コマンドラインを代入
sdim CmdList,200,30 ;受け入れ先配列 sdim CmdList2,60000 ;処理後のパス格納変数 split Cmdline,"\"",CmdList ;”で区切る notesel CmdList repeat length(CmdList) ;分割数の分まわす if strlen(CmdList(cnt))>1{ ;空or単スペースでなければ noteadd CmdList(cnt) ;パスを回収 } wait 1 loop mes CmdList2 ;結果表示 stop



たんす

リンク

2012/6/11(Mon) 21:14:03|NO.47209

間違い発見。

notesel CmdList

notesel CmdList2
です。



GrapeColor(DION)

リンク

2012/6/11(Mon) 21:38:03|NO.47215

>>たんすさん
ありがとうございます
ダブルクオーテーションはファイルパスの両端に必ず付いてくるわけでは無いので、その方法では違う形式の場合に対応できません。
ですが、参考にしてみます。



たんす

リンク

2012/6/11(Mon) 21:55:15|NO.47217

単ファイルのときに「”」が必要なのであれば、足してから処理してしまえばよいのですよ。

CmdLine="\""+CmdLine+"\""	;前後に「"」を追加。
split Cmdline,"\"",CmdList ;「"」で区切る

これで「パスが1つ」かつ「スペースも入っていない」時でも同じ処理が出来る。(はず



foobar

リンク

2012/6/11(Mon) 22:06:04|NO.47218

Win32APIのCommandLineToArgvWを使えば済むと思いますよ。
http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx



GrapeColor(DION)

リンク

2012/6/11(Mon) 22:55:37|NO.47222

>>foobarさん
ちょっと試してみたのですがエラーが出て、上手く扱えませんでした。

#uselib "kernel32" #define global GetCommandLine GetCommandLineA #func global GetCommandLineA "GetCommandLineA" #func global GetCommandLineW "GetCommandLineW" #func global GetLastError "GetLastError" #func global GlobalFree "GlobalFree" sptr #func global LocalFree "LocalFree" sptr #uselib "user32" #func global CommandLineToArgvW "CommandLineToArgvW" wptr,wptr sdim CmdLine, 256 GetCommandLine CommandLineToArgvW stat, varptr(CmdLine) LocalFree stop
APIについては全く知識がないので使用方法などをご教授お願いします。



skyblue

リンク

2012/6/12(Tue) 18:14:46|NO.47233

>ちょっと試してみたのですがエラーが出て、上手く扱えませんでした。
どういうエラーメッセージですか?



暇人

リンク

2012/6/12(Tue) 23:34:52|NO.47243

確実に間違ってるのは

>#uselib "user32"
使うのはshell32.dll

>LocalFree
ハンドルが指定されてない

他にも
>CommandLineToArgvW
http://msdn.microsoft.com/ja-jp/library/cc429051.aspx

GetCommandLineAじゃ無くてGetCommandLineWの返す値
文字列型じゃなくて整数変数へのポインタ(個数が返るだけ)
statに引数リストのポンタが返る
リストは文字列のアドレスが先頭から4バイトずつ並ぶ(その後にコマンドが並んでる感じ)

#uselib "kernel32" #func global GetCommandLineW "GetCommandLineW" #func global LocalFree "LocalFree" sptr #uselib "shell32" #func global CommandLineToArgvW "CommandLineToArgvW" wptr,wptr GetCommandLineW lpCmdLineW=stat CommandLineToArgvW lpCmdLineW, varptr(NumArgs) if stat=0 {dialog "リストが無い":end} pCmdList=stat repeat NumArgs dupptr p,pCmdList+cnt*4,4,vartype("int") dupptr temp_CmdLineW,p,256,vartype("str") CmdLinesA(cnt)=cnvwtos(temp_CmdLineW) mes CmdLinesA(cnt) loop LocalFree pCmdList mes "LocalFree "+stat stop



暇人

リンク

2012/6/13(Wed) 07:10:40|NO.47245

> repeat NumArgs
> dupptr p,pCmdList+cnt*4,4,vartype("int")
> dupptr temp_CmdLineW,p,256,vartype("str")
こっちより

dupptr p,pCmdList,4*NumArgs,vartype("int") repeat NumArgs dupptr temp_CmdLineW,p(cnt),256,vartype("str")
こっちのが分かりやすいかな?



MillkeyWeler

リンク

2012/6/13(Wed) 16:40:18|NO.47251

話を最初に戻すけど、コマンドラインにファイル名を渡す。
ってのをしっかりと理解した方がいいと思うよ。

[例え]
Cドライブに、

Program Files (フォルダ)
Program (フォルダ)
Files (ファイル)

というフォルダがありました。
ユーザーは、ダブルクォーテーションなしでコマンドラインに、「C:\Program Files」 を指定しました。
さてこれは、引数が一つ指定でしょうか? それとも二つの指定でしょうか?

普通なら、「C:\Program Files」の指定なんだなーっと思うけど、ないとも言い切れないでしょ?

>>開発者の都合でユーザーが不便な思いをするなんて私は我慢できません。
わかるんだけれども、ソフト側が正しく判別できない場合は、check さんの言うとおりに、弾くしかない場合もある。

開発者が意図しない動作は、必ずと言ってもあるから、その点を考慮しないといけない。
きつい言い方だと思うけど、ユーザーの事を考えるなら、想定外の事も予測しなきゃね。



GrapeColor(DION)

リンク

2012/6/14(Thu) 15:27:26|NO.47263

パソコンが発火してしまい、返信ができませんでした
NO.47243の時点で解決できました
暇人さんありがとうございます



ONION software Copyright 1997-2021(c) All rights reserved.