勝手にしやがれ Part2.

【投稿時の注意】
パスワード入力:必須。投稿後の削除時は同じパスワードを使います。
投稿者入力:いまのところ任意。入力を省略すると「名無しさん」がデフォルトで表示されます
Eメール入力:いまのところ任意。
リンクの入力:本文中に http の文字列が含まれると投稿出来ません。URL を貼るときは h 抜きで ttp:// とするなど工夫してみて下さい

2 / 13 ツリー ←次へ | 前へ→

【119】srepについて 文太 2008/10/07(火) 23:21
【122】Re:srepについて Si 2008/10/08(水) 1:34
【126】Re:srepについて 文太 2008/10/10(金) 18:58
【129】Re:srepについて Si 2008/10/12(日) 18:01
【130】Re:srepについて 文太 2008/10/12(日) 23:01
【131】Re:srepについて Si 2008/10/14(火) 0:31
【132】Re:srepについて 文太 2008/10/14(火) 15:12
【133】Re:srepについて 文太 2008/10/14(火) 15:17
【134】Re:srepについて Si 2008/10/15(水) 1:18
【135】おお、できた!(xeq!) 文太 2008/10/15(水) 22:56
【136】Re:おお、できた!(xeq!) 文太 2008/10/16(木) 23:17
【137】Re:おお、できた!(xeq!) Si 2008/10/19(日) 23:29
【155】32ビットコンソール 文太 2008/10/25(土) 11:02
【158】Re:32ビットコンソール Si 2008/10/25(土) 23:56
【159】Re:32ビットコンソール 文太 2008/10/26(日) 0:23
【141】Re:おお、できた!(xeq!) としき 2008/10/20(月) 23:40
【144】ワイルドカードの展開規則 文太 2008/10/21(火) 14:00
【145】Re:ワイルドカードの展開規則 文太 2008/10/21(火) 14:04
【149】Re:ワイルドカードの展開規則 文太 2008/10/22(水) 11:01
【151】Re:ワイルドカードの展開規則 Si 2008/10/23(木) 1:21
【153】Re:ワイルドカードの展開規則 文太 2008/10/24(金) 15:48
【154】Re:ワイルドカードの展開規則 文太 2008/10/25(土) 0:19
【156】Re:ワイルドカードの展開規則 としき 2008/10/25(土) 22:50
【157】Re:ワイルドカードの展開規則 文太 2008/10/25(土) 23:37
【161】Re:ワイルドカードの展開規則 文太 2008/10/27(月) 17:55
【152】Re:ワイルドカードの展開規則 文太 2008/10/23(木) 16:44

【119】srepについて
 文太  - 2008/10/07(火) 23:21 -

引用なし
パスワード
    ついにここまで来てしまいました。
 使い方を教えて欲しいという甘えたお願いです。

C:\>which debug |srep dir

ドライブ C: のボリュームラベルはありません.
ボリュームシリアル番号は 5094-14F9
ディレクトリは C:\WINDOWS\TEMP

_SREP0  $$$    31 08-10-07  23:10
    1 個       31 バイトのファイルがあります.
         1023932928 バイトが使用可能です.

 debug.exeがどこにあるのか検索し(c:/windows/system32/debug.exeと見つかるはず)、それがどんなファイルかを(サイズ、タイムスタンプなど)dirコマンドで表示。
 意図とは違う結果なのです。何がいけないのでしょうか? m(__)m

ディレクトリは C:\WINDOWS\SYSTEM32

DEBUG  EXE   23834 03-04-03  21:00
    1 個      23834 バイトのファイルがあります.
         1023932928 バイトが使用可能です.

 などと表示されることを期待したのですが。m(__)m

【122】Re:srepについて
 Si  - 2008/10/08(水) 1:34 -

引用なし
パスワード
   ▼文太さん:
> ついにここまで来てしまいました。

お、恐れていたことが・・・

WILD や LOGSORT の話題で久しぶりにここの掲示板も枯れ木も山の賑わいとなり、いろいろとコミュニケーションを楽しませて頂いていたのですが、何となく昨日辺りから srep が気になっていたのです。悪い予感が当たってしまいました ^^;

> 使い方を教えて欲しいという甘えたお願いです。

こちらでも試してみました。
使い方は問題なさそうです。期待した動作にならないのは srep 側の問題ですね。

自分でも生DOS以外では動かしたことがなかったような気がします。

LOGSORT の正式版、WILD、srep の 32bit化、何だか一気にいくつも宿題が出てきてしまいましたが、しばし時間を下さい。

【126】Re:srepについて
 文太  - 2008/10/10(金) 18:58 -

引用なし
パスワード
   Siさん

> 使い方は問題なさそうです。期待した動作にならないのは srep 側の問題ですね。

 そうですかぁ。(>_<) m(__)m 
 てっきり使い方がいけないのかと。因みに純Dosでもまったく同じように展開
(?)されているようでした。

> LOGSORT の正式版、WILD、srep の 32bit化、何だか一気にいくつも宿題が出てき
> てしまいましたが、しばし時間を下さい。

 どうぞ、どうぞ、ごゆっくり。一つずつ、一つずつ。

【129】Re:srepについて
 Si  - 2008/10/12(日) 18:01 -

引用なし
パスワード
   ▼文太さん:
>Siさん
>
>> 使い方は問題なさそうです。期待した動作にならないのは srep 側の問題ですね。
>
> そうですかぁ。(>_<) m(__)m 
> てっきり使い方がいけないのかと。因みに純Dosでもまったく同じように展開
>(?)されているようでした。

す、すみません。作者のくせに間違った動作説明をしていました。

SREP の動作の簡単な説明をしますと、

1.最初のコマンドの(stdout への)出力結果をテンポラリファイルに保存します。
  (テンポラリファイル名は毎回保存しなければ、_SREP0.$$$ です)
2.次に2番目のコマンドにはこのテンポラリファイル(のフルパス名)を渡します。

従って、

C:\>which debug |srep dir

を実行したときに、 dir に引数として渡されるのは、_SREP0.$$$ のフルパス名となります。

例えば、
dir /b /s *.pat | srep vzibmj

これは、

vzibmj C:\WINDOWS\Temp\_SREP0.$$$

と展開されます(テンポラリディレクトリが "C:\WINDOWS\Temp"の場合)。
(dir に /s オプションを付けているのはこれをやらないとフルパス名にならないので)

また、
dir /b /s *.pat | srep /@ vzibmj

とやると、

vzibmj @C:\WINDOWS\Temp\_SREP0.$$$

と展開され、_SREP0.$$$ をレスポンスファイルとみなしてそこに(フルパス名で)書かれたファイルを Vz で開きます。

ちなみに、ここで vzibmj.com を直接指定しているのは vz.bat だと何故かうまくいなかかった為です。

dir /b /s *.pat | srep vz.bat
コマンドまたはファイル名が違います.
*** 動作機種が違います(Illegal hardware).

こうなってしまいました。

ということで、正しい回答は、

「期待した動作にならないのは srep 側の仕様です。」

でございます。

# /b オプションの動作が何だか変なことに気付きました。とりあえずこのオプションは見なかったことにしておいて下さい ^^;

【130】Re:srepについて
 文太  - 2008/10/12(日) 23:01 -

引用なし
パスワード
   Siさん

> す、すみません。作者のくせに間違った動作説明をしていました。

 やっぱ。すいません、お手数をお掛けしました。最初そんな気がしたのですが、

C:\>which debug |srep dir

 が現実的な課題だったものですから。(発見はXPのdebug.exeは16ビット・
アプリだったということ、どうでもよい)

 すると、上の課題は、素直に

C:\>which debug
c:/windows/system32/debug.exe        ;これをVzでマニュアル取得

C:\>command.com /cdir c:/windows/system32/debug.exe
が駄目なので(やれやれ)

C:\>command.com /cdir c:\windows\system32\debug.exe    ;手で書き換え
                            (マクロ書くか?)
ドライブ C: のボリュームラベルはありません.
ボリュームシリアル番号は 5094-14F9
ディレクトリは C:\WINDOWS\SYSTEM32

DEBUG  EXE   23834 03-04-03  21:00
    1 個      23834 バイトのファイルがあります.
          933289472 バイトが使用可能です.

しかありませんかね。やれやれだなぁ。「\」と「/」が憎いなぁ、やっぱり。
こんなこと滅多にしないのでよいのですが、やってることがものすごく泥臭くて
惨めなものですから。

因みに、>command.com /cdirは、Vzでコンソールファイルを取るためです。

【131】Re:srepについて
 Si  - 2008/10/14(火) 0:31 -

引用なし
パスワード
   ▼文太さん:
>しかありませんかね。やれやれだなぁ。「\」と「/」が憎いなぁ、やっぱり。

which debug |sed s/\//\\/g

こんなのはどうでしょう?文太さんには釈迦に説法ですね ^^;
うーん、これでも dir コマンドにつながらない・・・

実は、which もどきと dir を合体させたバッチファイルも作ってみたのですが、Vz のコマンドラインからでは出力結果が得られませんでした(dir じゃなくて command /c dir で書きましたけど)。

【132】Re:srepについて
 文太  - 2008/10/14(火) 15:12 -

引用なし
パスワード
   Siさん

> which debug |sed s/\//\\/g
> こんなのはどうでしょう?文太さんには釈迦に説法ですね ^^;

 釈迦説でもないですが、同じソリューションを某所でも提案されました。
 ただ僕は別な場面でも同じ課題にあたったので、昨晩、マクロを書きました。

> うーん、これでも dir コマンドにつながらない・・・

 繋がりません。「c:/hog/foo.txt」を「c:\hog\foo.txt」に変換してPSに
入れるという手前までのマクロでした。で、dirを書き加えて実行。あるいはPF
に入れてタグジャンプ。

>  実は、 which もどきと dir を合体させたバッチファイルも作ってみたのです
> が、 Vz のコマンドラインからでは出力結果が得られませんでした(dir じゃな
> くて command /c dir で書きましたけど)。

 バッチで勝算がありましたでしょうか?
 えーと、XPでのコンソール・ファイルという意味でしょうか? でしたらVz
起動バッチで(autoexec.vzt <- autoexec.ntがオリジナル)、

vkeyc.com
vwx -z2 -l6144 -x1 -v3
pansi.com            ;★コレ
vz -z
cls

 とpansi.comを仕込むといけますよ。
ttp://hp.vector.co.jp/authors/VA003655/
 ですが。

 外れかな?

【133】Re:srepについて
 文太  - 2008/10/14(火) 15:17 -

引用なし
パスワード
    慌てて追記。

 「which もどき」が32ビット・アプリだとたぶん駄目です。16ビットなら
Vzでコンソール・ファイルの参照ができます。

【134】Re:srepについて
 Si  - 2008/10/15(水) 1:18 -

引用なし
パスワード
   ▼文太さん:
> 「which もどき」が32ビット・アプリだとたぶん駄目です。16ビットなら
>Vzでコンソール・ファイルの参照ができます。

あ、書き方が悪かったですね。
「which もどき」は単独のアプリではなくて、ひとつのバッチファイルで "which もどき + dir" を実現する、というものです。

実際のバッチファイルの中身は、

@echo off
for %%I in (%1 %1.com %1.exe %1.bat %1.cmd) do if exist %%~$path:I dir %%~$path:I

これだけです。dir のところは command /cdir に置き換えたりしてみて下さい。

ttp://www.atmarkit.co.jp/fwin2k/win2ktips/319which/which.html

↑ここのサイトを参考にしました。

>とpansi.comを仕込むといけますよ。

pansi.com(pansi.sys) は RCP32 についてのめざらさんとのやりとりの中で出てきたので、その時に一応ダウンロードはしてみました。
が、元々、DOS から Windows2000 まで PC-98x1 ユーザーだった自分には ansi.sys さえ何者なのか良く分からないレベルでして、pansi.com(pansi.sys) も結局落としたままになっています(これでめざらさんとのやりとりも中途半端になってしまったのですが)。

自分の使用環境では、普通に(と書くと語弊がありますが)使う分には素のコマンドプロンプトで問題ないのです(と勝手に思ってます)。

で、再び本題に戻ります。

あれこれ思いつくままに試していたのですが、UNIX-like tools(Ver 4.12f)を使ってみたら、

C:\>xeq dir `which -m -w grep`

ドライブ C: のボリュームラベルはありません.
ボリュームシリアル番号は XXXX-XXXX
ディレクトリは C:\BCB6\BIN

GREP   EXE  102400 02-03-08  6:00
    1 個     102400 バイトのファイルがあります.
         1014699520 バイトが使用可能です.

こんなんが出来ました。
Vz 環境では試してません(素のコマンドプロンプトです)。

【135】おお、できた!(xeq!)
 文太  - 2008/10/15(水) 22:56 -

引用なし
パスワード
   Siさん

 ありがとうございました。xeq (execute なのね)は濃すぎて、まだまだ解析
途上ですが、おもしろいですね。wild に似てるし、そのあたりの原理的なこと
が分かるようになれるみたいで楽しみです。「Dosのワイルドカードの制限っ
てそういうのなの。UNIX は、そうなってるんだ」という具合です。

C:\>xeq dir `which -m -w grep`

ドライブ C: のボリュームラベルはありません.
ボリュームシリアル番号は 5094-14F9
ディレクトリは C:\BIN

GREP   EXE   90959 94-06-02  18:50
    1 個      90959 バイトのファイルがあります.
          932444160 バイトが使用可能です.

C:\>xeq dir `which -m -w debug`

ドライブ C: のボリュームラベルはありません.
ボリュームシリアル番号は 5094-14F9
ディレクトリは C:\WINDOWS\SYSTEM32

DEBUG  EXE   23834 03-04-03  21:00
    1 個      23834 バイトのファイルがあります.
          932444160 バイトが使用可能です.

 For と pansi.com については、まぁまぁ、ということで。いやあ、which あ
るのに、「何でまた?」とすぐ思ってしまう。また、cmd の壁もあるので…。
 そうです、「ふつう」pansi.com は、XPでは必要とされないのです。笑い。
もっとも、Vz用の起動バッチ(アイコン)を作っておいても便利は便利かもし
れませんけれど。めざらさんのところに、親切な案内がありますけれど…。

ttp://homepage3.nifty.com/mezala/vz/env/win/winxp.html

【136】Re:おお、できた!(xeq!)
 文太  - 2008/10/16(木) 23:17 -

引用なし
パスワード
   xeq dir `which -m -w grep` ★

 ああ、「-m、-w」は which のオプションだったんですね。 構文的に当たり前
ですが、xeq のオプションが多すぎて、くらくらしてしまっていたのものですか
ら。

>     -m: パスの区切りを「/」でなく「\」で表示する(MS-DOS format)。

 なんてのがあるなんて。ウルウル。(やっぱ、あのマクロ、意味なかったか。
いえいえ、こんなオプション付けてくれるDos愛好家は、そうそういないので
す。)

 「-w」にも参りましたね。僕の場合(標準なはずですが−−デフォですよね−
−)、pathに入っていましたが。

 上の★は、xeqが特殊なのかと思ったら、

>  [4]「` `」によるコマンド出力の置換
 すごい! 知りませんでした。ありがとうございました。これは、ほんとすごい
や。m(_B_)m

>     ls -l `which -a sort`
>       sortという名前のコマンド全てをls -lする。
>     what `which jgawk`
>       jgawkコマンドに対しwhatを実行。
 なんてサンプルがありました。

 で、話がずれるのですが、この流れで、当然、wild.man (in unix-like tools)
を読んでみたわけです(難い、むずい)。

>       MS-DOS本来のワイルドカードでの「*」とは働きがかなり異なるので
>       注意せよ。DOS本来のワイルドカード解釈では「*」は、ファイル名
>       の本体および拡張子のそれぞれの中において、「*」以降の文字列照
>       合をしない、という意味を持っており(例えば「p*」は「pqr.c」に
>       はマッチしない)

 「MS-DOS 本来」っていっても色々ヴァージョンありますから、ということか
な、と思うのですが、XP、モバギ(dos 6.20 )とも「>dir p*」でマッチして
しまったのですが、実験がどこか間違っておりますでしょうか。 いえ、wild の
作者なら、きっと分かるだろうと…。そうかぁ、ワイルドカードの展開って、そ
う簡単なことじゃないんですね。今頃わかってる…。m(__)m

【137】Re:おお、できた!(xeq!)
 Si  - 2008/10/19(日) 23:29 -

引用なし
パスワード
   ▼文太さん:
>な、と思うのですが、XP、モバギ(dos 6.20 )とも「>dir p*」でマッチして
>しまったのですが、実験がどこか間違っておりますでしょうか。 いえ、wild の
>作者なら、きっと分かるだろうと…。そうかぁ、ワイルドカードの展開って、そ
>う簡単なことじゃないんですね。今頃わかってる…。m(__)m

確かに p* で pqr.c もマッチしてしまいますね。どういうことなのかは・・・
分かりません ^^;

DOS版の UNIX-like tools(Ver 4.12f) は LSI-C で作られているかと思うのですが、確かLSI-C(試食版)は引数でのワイルドカードの扱いがちょっと特殊だったような気がします。これに関連するのかもしれません。真相は分かりませんが。

>もっとも、Vz用の起動バッチ(アイコン)を作っておいても便利は便利かもし
>れませんけれど。めざらさんのところに、親切な案内がありますけれど…。
>
>ttp://homepage3.nifty.com/mezala/vz/env/win/winxp.html

ショートカットから command.com をダイレクトに起動してしまうのですねえ。うーん、こういう発想はなかったです。Windows で Vz使ってるみなさんは(それぞれカスタマイズされているでしょうが)こういう環境が基本なんでしょうね。この辺りに自分のところと「コマンドライン」で一括りに出来ないギャップがあるような気がします。

余談ですが、文太さんが133番のレスで書かれているのを見て自分が Vz から離れてしまった背景をようやく思い出しました。

コマンドプロンプトはソフト開発で利用する機会が多いのですが(なんて言って長い間サボりっぱなしでしたが)、そうです、Vz 環境では 32bitコンパイラの吐き出すメッセージをコンソールで参照出来ないのですね。で、結局テキストエディタも Win32 版のものを常用するようになってしまった訳で。勘違いがなければこんな背景だったかと。

【141】Re:おお、できた!(xeq!)
 としき WEB  - 2008/10/20(月) 23:40 -

引用なし
パスワード
   >>(例えば「p*」は「pqr.c」にはマッチしない)

この記述は変ですねぇ。
もしかして、DOS version 1のころはそうだったのでしょうか。
私、DOS3.1以降のMS-DOSで、そのような挙動を示すバージョンは
寡聞にして知りません。

【144】ワイルドカードの展開規則
 文太  - 2008/10/21(火) 14:00 -

引用なし
パスワード
    basefilename.extention の「.」が区切りとして機能するのか、と問題を整理
したつもりです。
 で、 unix-like tools の新出さんが言う「MS-DOS 本来の」ワイルドカード展
開規則に沿っているのは、command.com でも cmd.exe でもなく、wild.com(16
ビット)であるとの結論を得ました。合ってますでしょうかねぇ? もちろん、
現代において(?)ですけれど。

 (「?」は考えてません。 使わないもの。また。拡張子ありとなしを現実的に
使い分ける=同じディレクトリに入れることもあまりないと思うのですけれど…。
少なくとも僕の場合には。)


 結論:XPの command.com と cmd.exe の振舞いは同じで、「*」に関するか
ぎり両者とも「.」を区切りとしては認識しないようです。


 見て分かると思いますが、C:\WORKディレクトリには、
AAA
AAA.TXT
 の2つのファイルが入っています。

---------------------------------------------------
C:\WORK>command.com /cdir *.*
AAA         3 08-10-21  13:48
AAA   TXT     7 08-10-21  13:48

C:\WORK>command.com /cdir *
AAA         3 08-10-21  13:48
AAA   TXT     7 08-10-21  13:48

C:\WORK>wild -D "sed \"n\"" *        #commandは何でもよい。
DEBUG MODE:sed "n" C:\WORK\AAA

C:\WORK>wild -D "sed \"n\"" *.*
DEBUG MODE:sed "n" C:\WORK\AAA
DEBUG MODE:sed "n" C:\WORK\AAA.TXT

C:\WORK>command.com /cdir A*
AAA         3 08-10-21  13:48
AAA   TXT     7 08-10-21  13:48

C:\WORK>command.com /cdir A*.*
AAA         3 08-10-21  13:48
AAA   TXT     7 08-10-21  13:48

C:\WORK>wild -D "sed \"n\"" A*
DEBUG MODE:sed "n" C:\WORK\AAA

C:\WORK>wild -D "sed \"n\"" A*.*
DEBUG MODE:sed "n" C:\WORK\AAA
DEBUG MODE:sed "n" C:\WORK\AAA.TXT
---------------------------------------------------

 ※拡張子なしファイルを僕はほとんど作らないし、作らないようにしているの
  ですが、wild の「正しい」振舞いには、いつかはまる可能性もあったので、
  実験しておいて(忘れなければ)、いちおうよかったかな、と思う。


 ※もしかして、「.」がディレクトリに入れるようになったあたりから、この
  あたりの仕様変更があったのかもしれません。確かVzが拡張子付きディレ
  クトリに対応したのも 1.5 以降だったような…。c.mos さんがぶつぶつ言
  っていた記憶があります…。関係ないかな???


 というわけで(泥沼だぁ〜)、思いついたら実験。 新たに「aaa.aaa」なるサ
ブディレクトリを作ってみた。(cmd.exe はここでは大小文字を無視? うーん、
えーと、えー???)

C:\WORK>command.com /cdir a*
AAA         3 08-10-21  13:48
AAA   AAA <DIR>   08-10-21  14:17
AAA   TXT     7 08-10-21  13:48

C:\WORK>command.com /cdir a*.*
AAA         3 08-10-21  13:48
AAA   AAA <DIR>   08-10-21  14:17
AAA   TXT     7 08-10-21  13:48

 cmd.exe, command.comに違いなし。


 何かがわかったのだろうか? wildの挙動は確認できましたけれど…。

                        トホホ・マン・文太

 (あまり意味のない)追伸:「*.*」ってのを最初にワイルドカードとして覚
えた記憶があり(MS-DOS3.3D時代)、で「*.*」と「*」に違いがある・あった
のだろうというところから出発しました。

【145】Re:ワイルドカードの展開規則
 文太  - 2008/10/21(火) 14:04 -

引用なし
パスワード
    32ビットじゃないのを知ったのですが…。

C:\WORK>wild32 -D "sed \"n\"" A*.*
cmdline = sed \n\ C:\WORK\AAA
cmdline = sed \n\ C:\WORK\AAA.TXT

C:\WORK>wild32 -D "sed \"n\"" A*
cmdline = sed \n\ C:\WORK\AAA

 LFN対応wild.exeもwild.comに同じ。

【149】Re:ワイルドカードの展開規則
 文太  - 2008/10/22(水) 11:01 -

引用なし
パスワード
    「*x*」という指定の仕方は cmd.exe 固有だったと思う。意味は、「ファイル
名の【どっかに】x を含むこと」だと思う。
 伝統的な command.com だと、「x*」なら「x」が生きるけど、「*x」では、
「*」によって「x」が殺されてしまい意味がなくなる、だったと思う。

 以下、例によってXP環境。

C:\XYZ>command.com /cdir *x*
ABC         0 08-10-18  16:31     #(1)「x」は死んでる
ABC   TXT     0 08-10-18  16:31     #(2)よってここで「x」がは
                        #生きてるように見えるかも
                        #しれないがそうではない
                        #だろう。
C:\XYZ>command.com /cdir *x*.*
ABC         0 08-10-18  16:31     #(3)間違いなく「x」は死ん
ABC   TXT     0 08-10-18  16:31     #でる。(4)もっと間違いなく
                        #「x」は死んでる

C:\XYZ>dir *x*                 #cmd.exe
2008 10 18 16:31         0 ABC.TXT   #(5)「x」が生きている
                        #ABCの方が出てこないから。
C:\XYZ>Wild -D "sed \"n\"" *x*
DEBUG MODE:sed "n" C:\XYZ\ABC          #えーと、これは読めません。
                        #いえ、読めました。
        #「*.*」と「*」の意味が違い、「.」が区切りとして機能する
        #場合、「*x*」は「*」の意味になり、「拡張子なしファイル」
        #=ベースファイルネームは何でもよい、となるのですね。
        #もちろん、「x」は死んでいる。

 結論:「*x*」で、cmd.exe と command.com と wild は【とても】違う。そも
そもそんな指定を許しているのは cmd だけで、それ以外は「.」の解釈が絡み、
錯綜する。ふつう使わないほうが混乱が少ないと思う。


 論理的読解で、辻褄を合わせるために「ずる」と抜け落ちがあるな、と実は思
っていますが、実用レベルではこんなところでどうでしょう? >誰か。

【151】Re:ワイルドカードの展開規則
 Si  - 2008/10/23(木) 1:21 -

引用なし
パスワード
   文太さんが熱心にやられているので簡単なファイル検索プログラムを書いてちょっと試してみました。

BC++5.02 で作成した 16bit 版の実行ファイルで XP上の "MS-DOSプロンプト"(CMD.EXE ではなく command.com を直接起動したもの)での実験結果では、
まさに、

>(例えば「p*」は「pqr.c」にはマッチしない)

が再現しました。

同じソースから作成した 32bit 版の実行ファイルではこのような挙動はなく、みなさんが書かれているような動作でした。

-----------------------

以下、既にご存じの部分もあるかも知れませんが・・・

1.Cコンパイラで作成した自作アプリの場合
コマンドライン引数に指定されたワイルドカードはそのままの文字列として実行ファイルに渡されます(註1)。
で、ワイルドカード(を含む文字列)を対象にした実際のファイル検索は、コンパイラ固有の関数(findfirst や _dos_findfirst)、あるいは WIN32API (FindFirstFile)を使って行われます。
ということは、引数に指定されたワイルドカードをアプリ側でどう扱うのか?はコンパイラ依存の部分もあるのではないと思うのです(きちんと検証した訳ではないのであくまで仮説です)。

(註1)LSI-C試食版の場合はちょっと違って、デフォルトの動作ではワイルドカードは展開された状態でアプリに渡されます。これを抑制するのには noexpand.obj をコンパイル時にリンクします。

2.OSの内部コマンド、付属外部コマンドの場合
おそらく 100% OSの仕様による、と言うところではないでしょうか(これもきちんと検証した訳ではありません)。

【152】Re:ワイルドカードの展開規則
 文太  - 2008/10/23(木) 16:44 -

引用なし
パスワード
   >  「*x*」という指定の仕方は cmd.exe 固有だったと思う。

 いちおう訂正。「cmd.exe 固有」というより、Windows95のLFNサポート時
からだそうです。また、これに絡み、いちおう以下を追記しておきます。LFNの
エイリアス(SFN)でも当たるから注意してね、という話。そのディレクトリ
環境によっては、「長いファイル名.txt」が「長いフ~1.txt」になったりすること
がありますが、この「1」もヒットするからね、ということ。そして、「~1」は
Windowsが勝手につけるのでなおさら注意とのこと。(出典:天野司『WindowsDos
プロンプトポケット・リファレンス』、同『WindowsXP/2000コマンドプロンプト
ポケット・リファレンス』)

【153】Re:ワイルドカードの展開規則
 文太  - 2008/10/24(金) 15:48 -

引用なし
パスワード
   Siさん、m(__)m

>  文太さんが熱心にやられているので簡単なファイル検索プログラムを書いてち
> ょっと試してみました。

 わざわざどうもありがとうございます。m(__)m

> >(例えば「p*」は「pqr.c」にはマッチしない)
> が再現しました。

 Siさんが推測されているように「処理系」依存なのでしょうね。それでも、上は
MS-DOS環境では、それほど古いことでも珍しいことでもないようです(正直言って、
「.」を区切り文字と認識するwild.(com|exe)の仕様のほうが分かりやすいと思う。
とりわけLFNに個人的にやっかいになることが少ないと。とはいえ、a.b.c.dなん
てファイル名を許すとなると、過去との互換性はぐちゃぐちゃになるでしょうね。)

------------------------------------------------
C:\XYZ>Command.com /cType abc      #拡張子なしが(1)
aaa

C:\XYZ>Command.com /cType abc.txt    #拡張子ありが(2)
aa

#GNU sed version 1.18 + multi-byte extension 1.03
C:\XYZ>sed "s/a/b/g" *         #(1) matched
bbb

C:\XYZ>sed "s/a/b/g" *.*        #(1)(2) both matched
bbb
bb

#serow版
C:\XYZ>oldsed "s/a/b/g" *        #(1) matched
bbb

C:\XYZ>oldsed "s/a/b/g" *.*       #(1)(2) both matched
bbb
bb

C:\XYZ>Jgawk "{gsub(/a/,\"b\");print}" *    #(1) matched
bbb

C:\XYZ>Jgawk "{gsub(/a/,\"b\");print}" *.*   #(1)(2) both matched
bbb
bb

C:\XYZ>Jperl4 -pe "s/a/b/g" *      #(1) matched
bbb

C:\XYZ>Jperl4 -pe "s/a/b/g" *.*     #(1)(2) both matched
bbb
bb
------------------------------------------------

 なんだか当たり前のことを検証しているような気がしてきた…。
 あるいは、僕が問題を途中で間違った方向に引っぱってしまったか…。
 command.com and cmd.exe@XPが、MS-DOS的観点からすると、やっぱ特殊
なんではないでしょうかねぇ。
 そしてSiさんが教えてくれたように、32ビットなWindowsAPIの世界では、
cmd.exe的解釈が標準であると。
 となると、やはり2つの世界に引き裂かれているcommand.comが一番ぐちゃ
ぐちゃであると。違うかな。いや、一般化しなければ、command.com@XPは、
彼(女)自身とても大変そうであるばかりでなく、使うのも大変だ、と。

 一番最初に戻ると新出さんが言うことには、けっこう一般妥当性がありそうだ。
とはいえ、(まただ)モバなMS-DOS6, command.comがあったなぁ…。あいつも
相当ぐちゃぐちゃしてたなぁ…。

【154】Re:ワイルドカードの展開規則
 文太  - 2008/10/25(土) 0:19 -

引用なし
パスワード
    しつこいですね。すいません。とりわけSiさんとすれば、wildのことを除けば、
おそらくすごく興味がある話題でもないでしょうし。m(__)m

 ただ、ふと思いついてしまったのです。
 いえ、sed, awk, perlのDos日本語版移植はすべてserowさんがされているわ
けで、それらが違うほうが変だな、と。
 (もっともserowさんの影響を受けないでグレップの開発もなかったみたいで
はありますが…。)

 Dos環境ではワイルドカードの展開がそれぞれのツールにまかされていると
すると(これが最大のニュース)、もう、必要な場面で、逐一やるしかないので
すが、基準があると何が特殊か分かると思い、これだけはやっておこうと思った
グレップたちです。(command.comが「特殊」に分類されてしまったりする…。)
 どうやら、新出さんが正しいですね。ま、その後のことはともかく、思いっき
り間違ったことを書く人のわけはないですから。ワイルドも正しいです!

-------------------------------------------------
C:\XYZ>Command.com /cType abc
aaa

C:\XYZ>Command.com /cType abc.txt
aa

C:\XYZ>cgrep -t "aa" *        #wildcardさえマッチすれば両方
abc 1:aaa            #グレップされる検索パターン

C:\XYZ>cgrep -t "aa" *.*
abc 1:aaa
abc.txt 1:aa

C:\XYZ>ygrep -t "aa" *
abc    1:aaa

C:\XYZ>ygrep -t "aa" *.*
abc    1:aaa
abc.txt    1:aa

C:\XYZ>izgrep -t "aa" *
ABC 1:aaa

C:\XYZ>izgrep -t "aa" *.*
ABC 1:aaa
ABC.TXT 1:aa

C:\XYZ>grep "aa" *
aaa

C:\XYZ>grep "aa" *.*
ABC:aaa
ABC.TXT:aa

C:\XYZ>Command.com /cDir \bin\grep
GREP   EXE   90959 94-06-02  18:50

C:\XYZ>cgrepb "aa" *        #Bruce.さん版
aaa

C:\XYZ>cgrepb "aa" *.*
abc:aaa
abc.txt:aa

C:\XYZ>yagrep "aa" *        #32bit grep (by Bruce.さん)
ABC:aaa                #きっとWin APIがwildcard展開を担当
ABC.TXT:aa

C:\XYZ>yagrep "aa" *.*
ABC:aaa
ABC.TXT:aa
-------------------------------------------------

【155】32ビットコンソール
 文太  - 2008/10/25(土) 11:02 -

引用なし
パスワード
   Siさん

 気になっていたのですが…。

> コマンドプロンプトはソフト開発で利用する機会が多いのですが(なんて言って
> 長い間サボりっぱなしでしたが)、そうです、Vz 環境では 32bit コンパイラの
> 吐き出すメッセージをコンソールで参照出来ないのですね。で、結局テキストエ
> ディタも Win32 版のものを常用するようになってしまった訳で。 勘違いがなけ
> ればこんな背景だったかと。

 32ビット環境でコンソールの参照を可能にするにはどすればよいのでしょう?
QXにその機能がありますか? 32ビットなエディタなら普通あるものなので
しょうか? やはりcmd.exeその他の出力をリダイレクトして使うのには限界があり、
別窓でコピペしてクリップボード送りにすれば、Vz16ビット窓に持ってこれる
は持ってこれる(そこまでVzにこだわる? こだわってしまいますm(__)m)と前
から考えてはいたのですが。お教えいただけますでしょうか。m(__)m

【156】Re:ワイルドカードの展開規則
 としき WEB  - 2008/10/25(土) 22:50 -

引用なし
パスワード
   いくつか。

> Dos環境ではワイルドカードの展開がそれぞれのツールにまかされていると

現実的には問題ないとは言え、実はこれは最大の問題だったりする。
ソースが公開されているフリーウェアの場合、ものによっては、複数の処理系に
対応していたりするわけです。さらに、それぞれの処理系用のmakefileまで同梱
されていたりして。
そういう場合、DOSの時代の国産ソフトだと、たいがいはMS-C(or Quick C)とTurbo C(or Borland C)とLSI C-86ですが、配布されている実行ファイルをそのま
ま使っているうちはいいけれど、手持ちの処理系でコンパイルしなおしたら挙動
が違う、なんて事はありそうな話。


もう一つ、#136であった話ですが。

> 注意せよ。DOS本来のワイルドカード解釈では「*」は、ファイル名
> の本体および拡張子のそれぞれの中において、「*」以降の文字列照
> 合をしない、という意味を持っており(例えば「p*」は「pqr.c」に
> はマッチしない)

前段については、DOSの仕様として明記されている話のようです。
以下、NEC版MS-DOS5.0Aユーザーズリファレンスマニュアルより引用。

> アスタリスク(*)は、ファイル名の名前と拡張子の中で、それ以降が“1文
> 字以上の任意の文字列”を表すワイルドカードです。

ところで、手元には、ASCII出版局の「標準MS-DOSハンドブック」があります。
序文によると、この本は、さらに古いDOS2.0を対象に書かれています。なにせ、
84年が初版です。この本では、単純に

> "*"は、任意の複数文字とマッチします。

としか書かれていません。
ただ、この本の後ろの方には、重要な記述がありました。

> "*"はユーザープログラムまたはシステムコールによって"?"に展開しなければ
> ならない

これらから、以下は推測。
仕様としては、「*」は「????????.」に展開されるべきであった。ところが、な
ぜかシステムコールでは「????????.???」に展開されてしまっている。


おまけ。
参考というか、検証すればすぐわかる事なんですが。
今回、文太さん、「*」というワイルドカードについて調べています。
が、「*.」というワイルドカード指定であれば、多分、もっと安定な結果が得ら
れるのではないかと思います。

【157】Re:ワイルドカードの展開規則
 文太  - 2008/10/25(土) 23:37 -

引用なし
パスワード
   としきさん

 正確なところのフォローありがとうございます。全体に納得のいく話でした。

>> Dos環境ではワイルドカードの展開がそれぞれのツールにまかされていると
>現実的には問題ないとは言え、実はこれは最大の問題だったりする。
>手持ちの処理系でコンパイルしなおしたら挙動
>が違う、なんて事はありそうな話。
 実際上は試しようもありませんが、十分あり得ますね、きっと。

> 「標準MS-DOSハンドブック」
 Dos3対応版を数日前から探しています。引っ越しで捨てたのかなぁ。ったく。

>> "*"はユーザープログラムまたはシステムコールによって"?"に展開しなければ
>> ならない
>これらから、以下は推測。
>仕様としては、「*」は「????????.」に展開されるべきであった。ところが、な
>ぜかシステムコールでは「????????.???」に展開されてしまっている。

 これはやる気があれば調べられるはずですが、 はい、「* は単純に ? 複数個
に展開されて処理されており」という記述は見ました。きっとそうでしょう。

> 今回、文太さん、「*」というワイルドカードについて調べています。
> が、「*.」というワイルドカード指定であれば、多分、もっと安定な結果が得ら
> れるのではないかと思います。

 はい、その後そう気づいておりました。「文太さん的にはこう考え・調べるべき」
アドバイスありがとうございます。Dosレベルで(昔から)「foo.」というファ
イル名が許されているので(さすがに、fooの存在するディレクトリで共存はできま
せんが)。ありがとうございました。m(__)m

【158】Re:32ビットコンソール
 Si  - 2008/10/25(土) 23:56 -

引用なし
パスワード
   ▼文太さん:
> 32ビット環境でコンソールの参照を可能にするにはどすればよいのでしょう?
>QXにその機能がありますか? 32ビットなエディタなら普通あるものなので
> しょうか?(以下略)

はい。QXには外部コマンドを登録して実行する機能があり(これはQXに限らないか・・・)、そのコマンド登録の設定で、「DOS出力を取り込み」を有効にすると「最大16キロバイトの画面出力を取り込めます。」(QXのヘルプより)

なんですが、実は「この機能は Windows 95,98 上でのみ使用できます。」(同じくQXのヘルプより)です。 XP では「DOS出力を取り込み」にチェックを入れられないようになっています。

ここのところ諸般の理由でQX以外のエディタをもっぱら使っていますが、そちらにも外部ツールの標準出力、標準エラーのアウトプットを画面参照する機能は付いています。

いずれにしても Vz のようにコンソール参照だけでなく自前のコマンドライン機能を内蔵していてそこでコマンドを実行できる訳ではなく、あくまで参照するだけです。

で、XP上でのソフト開発はエディタとコマンドロンプトの両方のウィンドウを開いておいて、コマンドロンプト上で

make >err.txt

を実行。err.txt をエディタで開いてエラー箇所へのタグジャンプとかやってます。

タグジャンプだけなら出力結果を参照出来るだけで良いのですが、無事にコンパイル出来れば動作確認で .exe を実行してみたりしなければならないので結局コマンドロンプトを開いておく方が勝手が良いのです。
それなら Vz でも十分じゃない、とか突っ込まないで下さいね ^^;

なんだかあまり参考にならない話しですみません。

【159】Re:32ビットコンソール
 文太  - 2008/10/26(日) 0:23 -

引用なし
パスワード
   Siさん、毎晩のように夜遅くまでつき合ってくださり、感謝しています。

>  いずれにしても Vz のようにコンソール参照だけでなく自前のコマンドライン
> 機能を内蔵していてそこでコマンドを実行できる訳ではなく、あくまで参照する
> だけです。
>  で、 XP 上でのソフト開発はエディタとコマンドロンプトの両方のウィンドウ
> を開いておいて、コマンドロンプト上で
> make >err.txt

 そうですかぁ。いえ、たとえ参照できても、コンソールファイルとしてその複
数行をブロック的に取り込み、クリップボードに送らなければならないのだから、
きっとQXのマクロが書けなければ手間がかかりすぎることになるな、とその後
思っていたのです。

 で、リダイレクトが必要なら、きっと多くの場合、Vzでもリダイレクトし、
そのファイルにコマンド文字列を後から先頭に付加する、というマクロと同じで
すね(そういうマクロを作って使っているわけです)。

> それなら Vz でも十分じゃない、とか突っ込まないで下さいね ^^;

 つっこまないですよ。プロないしプロ級な方がWindowsに着いていきたいと考える
のはごくごく健康的な発想で、また、ここまでVzやcommand.comやDos窓、16ビ
ット・テキスト処理ツールにコミットするほうが、やはり不健全だよねとは思って
いますので、突っ込みません。それでも、これ、完全な趣味なんだから、いいんじゃ
ない、といつのまにか諦念してしまっている自分がいるのをみて、それを受け入れる
ことにした、というだけなのです。

> なんだかあまり参考にならない話しですみません。
               「し」を^取りましょう。名詞と動詞では送りがなが
               違うのです。m(__)m↓_
 すいません、逆に安心してしまいました。そうそううまい話はないし(Vzer的に)、
やっぱ、WindowsはWindowsじゃねーか、とか思ってしまってます。m(__)m

【161】Re:ワイルドカードの展開規則
 文太  - 2008/10/27(月) 17:55 -

引用なし
パスワード
   としきさん

> おまけ。
> 参考というか、検証すればすぐわかる事なんですが。
> 今回、文太さん、「*」というワイルドカードについて調べています。
> が、「*.」というワイルドカード指定であれば、多分、もっと安定な結果が得ら
> れるのではないかと思います。

 「サービスだぞ」って、わざわざ教えてくれているのに反応がとろくてすいま
せん。「え? 不定ではないけど…」とか思ってたりして。あう、あう。はい、
「*」を「*.」にしましたところ、直観からずれると思われていた command.com,
cmd.exe, ssed, egsed, mbsed, onigsed, yagrep, gawk, mawk32, tosfind のす
べてにおいて「拡張子なし」のファイルだけにマッチさせられました。32ビッ
ト・ツールを使うときにはこれでいきます。っていっても、拡張子のないファイ
ルつくらないし、それだけを選んで処理するということは、現実的にはなさそう
ですけどね。
 ま、人生長いので、これから先どうなるかなんて分かりません。転ばぬ先の、
ですね。多謝。m(__)m

2 / 13 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
14,033
(SS)C-BOARD v3.8 is Free