18

名前に数字が含まれているファイルを探しているときに、これを偶然に発見しました。私がタイプするとき:

dir *番号*

(ここで、数字は0から9までの任意の数字を表し、アスタリスクと数字の間にスペースはありません)

cmd.exeコマンドプロンプトで、検索条件に一致するさまざまなファイルが表示されないことを返します。奇妙なことに、ディレクトリによっては、機能する番号と機能しない番号があります。例として、Webサイトに関連付けられたディレクトリに、次のように入力します。

dir *4*

返されるのは次のとおりです。

C:\ Ampps \ www \ include\pagesのディレクトリ

2012年4月30日午後3時55分153inventory_list_retrieve.php
2012年6月18日11:17AM6,756 ix.html
06/19/2012 01:47 PM 257,501 jquery.1.7.1.js
               3ファイル264,410バイト
               0ディレクトリ362,280,906,752バイト空き

それは私には意味がありません。どんな手掛かり?

バッチプログラムではDIRコマンドがFORと組み合わされることが多いため、stackOverflowで問題が発生します。奇妙なDIR動作は、バッチプログラムがDIRコマンドを使用する場合、信頼性を低下させる可能性があるように思われます。

編集:(追記)。かなりの時間が経ちましたが、これには別の癖があり、ほとんど手間がかかりました。.htm特定のディレクトリツリー内のすべてのファイルを削除したかったのです。それを行う直前に、ファイルにも*.htm一致することに気づきました。.htmlまた、*.man一致.manifestし、おそらく他にもあります。その特定のディレクトリ内のすべての.htmlファイルを削除すると、控えめに言っても動揺していたでしょう。

4

4 に答える 4

17

コマンドプロンプトのワイルドカードは、長いファイル名と短い「8.3」名(存在する場合)の両方と照合されます。これは驚きを生み出す可能性があります。

短縮名を表示する/Xには、コマンドのオプションを使用しますDIR

この動作はコマンドに固有のものではなくDIR、ワイルドカードが。などのコマンドで予想以上に一致すると、他の(多くの場合不快な)驚きにつながる可能性があることに注意してくださいDEL

* nixシェルとは異なり、一致する名前のリストによるファイルパターンの置換は、各コマンド内で実装され、シェル自体では実装されません。これは、さまざまなコマンドがさまざまなワイルドカードパターンルールを実装できることを意味しますが、実際には、Windowsがパターンに一致するファイルをディレクトリで検索するAPI呼び出しを提供し、ほとんどのプログラムがそれらの呼び出しを明白な方法で使用するため、これは非常にまれです。「通常の」ツールを使用してCまたはC++で記述されたプログラムの場合、その拡張は、WindowsAPIを使用してCランタイムライブラリによって「無料」で提供されます。

問題のWindowsAPIはFindFirstFile()、およびその近親者、、、FindFirstFileEx()およびFindNextFile()ですFindClose()

奇妙なことに、のドキュメントでFindFirstFile()は、lpFileNameパラメータを「ディレクトリまたはパス、およびワイルドカード文字(アスタリスク(*)や疑問符()など)を含めることができるファイル名」と説明していますが、?実際には*?文字の意味を定義していません。

ファイルパターンの正確な意味は、 1970年代初頭にさかのぼるCP / Mオペレーティングシステムの歴史があり、MSDOSの設計に強い影響を与えました(ここでは「影響を受けた」の代わりに「直接コピーされた」と言う人もいます)。これにより、多くの「興味深い」アーティファクトと動作が発生しました。スペクトルのDOS側でのこのいくつかは、2007年のこのブログ投稿で説明されています。レイモンドは、ファイルパターンがDOSでどのように実装されたかを正確に説明しています。

于 2012-06-19T19:08:34.603 に答える
13

うん。これを試してみると、短い名前も検索されることがわかります。

dir /x *4*

(/ xスイッチは短縮名用です)

ファイル名をフィルタリングするには、以下を使用します。

dir /b | find "4"
于 2012-06-19T19:00:06.527 に答える
5

RBerteigの回答からの引用:

この動作はDIRコマンドに固有のものではなく、ワイルドカードがDELなどのコマンドで予想以上に一致すると、他の(多くの場合不快な)驚きにつながる可能性があることに注意してください。

上記は、非常に厄介なFORコマンドにも当てはまります。

for %A in (*4*) do @echo %A contains a 4

短い名前も検索します。解決策は、FINDまたはFINDSTRを使用して、より信頼性の高い方法で名前を除外することです。

for %A in (*) do @echo %A | >nul findstr 4 && echo %A contains a 4

注-バッチファイル内でコマンドを使用する場合は、%Aを%%Aに変更してください。

FORとFINDSTRを組み合わせることは、短いファイル名で問題が発生したコマンドを安全に使用するための汎用的な方法です。ECHOをCOPYやDELなどの問題のあるコマンドに置き換えるだけです。

于 2012-06-19T19:34:19.100 に答える
4

dirコマンドは、内部で短い(8.3マナー)ファイル名も検索するようです。

私がこれを呼ぶときdir *1*、これは私が得るものです:

 Volume in drive C is System
 Volume Serial Number is F061-0B78

 Directory of C:\Users\Piotrek\Desktop\Downloads
2012-05-20  17:33        23 639 040 gDEBugger-5_8.msi
2012-05-20  17:30           761 942 glew-1.7.0.zip
2012-05-20  17:11         9 330 176 irfanview_plugins_433_setup.exe
2012-05-24  20:17         4 419 192 SumatraPDF-2.1.1-install.exe
2012-05-15  22:55         3 466 248 TrueCrypt Setup 7.1a.exe
               5 File(s)  1 127 302 494 bytes

リストされたファイルの中にファイルがありますがgDEBugger-5_8.msi、明らかに文字が含まれていません1

/Xdirコマンドでswitchを使用すると、すべてが明らかになります。これにより、dirは8.3ファイル名を使用します。dir /X *1*コマンドからの出力:

 Volume in drive C is System
 Volume Serial Number is F061-0B78

 Directory of C:\Users\Piotrek\Desktop\Downloads


2012-05-20  17:33        23 639 040 GDEBUG~1.MSI gDEBugger-5_8.msi
2012-05-20  17:30           761 942 GLEW-1~1.ZIP glew-1.7.0.zip
2012-05-20  17:11         9 330 176 IRFANV~1.EXE irfanview_plugins_433_setup.exe
2012-05-24  20:17         4 419 192 SUMATR~1.EXE SumatraPDF-2.1.1-install.exe
2012-05-15  22:55         3 466 248 TRUECR~1.EXE TrueCrypt Setup 7.1a.exe
               5 File(s)  1 127 302 494 bytes

dirの助けからの引用:

/X          This displays the short names generated for non-8dot3 file
            names.  The format is that of /N with the short name inserted
            before the long name. If no short name is present, blanks are
            displayed in its place.
于 2012-06-19T19:08:18.287 に答える