1

これは、「回避策」が必要なWindows / cmdシェルハックを見つけるたびに、より複雑に見える要件の1つです。基本的に...DOSシェルのFORループ内のフォルダの特定のリストを反復処理する必要があります。これが私が思いついたループです:

 echo  ^ [start for test]
 for  /F "usebackq "  %%f IN (`dir /b /adh "w:\sandbox\tmp\"`)  DO (
    echo ^    do with file: %%f
    rem  <do something>
 )
echo  ^ [for test done]

主な必要性は、ソースフォルダー(ここではsandbox \ tmp)の隠しディレクトリを反復処理することです。

結果は驚くべきものであり、苛立たしいものです。これは、コンソールコマンドラインでこのFOR命令を使用した結果です。

W:..> for  /F "usebackq "  %f 
              IN (`dir /b /adh "w:\sandbox\tmp\"`)  DO echo ^ folder = %f
File Not Found                                <1>
  folder = C:\WINDOWS\system32\cmd.exe        <2>
  folder = any                                <4>
  folder = hidden-folder-01                   <3>
  folder = hidden-folder-02                   <3>
  folder = morph                              <4>
  folder = practice-northwind                 <4>

これは5つのフォルダをリストします。素晴らしい!そして、ラベルに1つのcmd.exe:< 2 >とラベルにミステリー:< 1 >。私が思う DIRスイッチについて説明する必要があります。

  • / b .......ベアフォーマット、ファイル/フォルダ名のみ。
  • / a dh .....隠しディレクトリとディレクトリの両方で、それを徹底的に試しました-動作しませんでした。
    / a hd
  • / a d ...... Directory属性を持つアイテム(フォルダー)。
  • / a h ......隠しファイル/フォルダ(一見)。

私は出力にラベルを付けました、そしてこれが私がこれまでに解決したものです。

  1. 「ファイルが見つかりません」...... .. ......わかりません。「ファイルが見つかりません」と表示されます。< 1 >は、/ahスイッチのアーティファクトです。私が言うとき:
    IN(dir /b /adh "w:\sandbox\tmp\"
  2. C:\ WINDOWS \ system32 ** cmd.exe ** .. ..スプリアスイテレータ(%% f); このエラーは、FOR/Fコマンドバージョンでのみ表示されます。隠しディレクトリを見つけたいのですが、ファイルセットリストに隠しファイルが返されません(d'oh)。したがって、これまでのところ、 FOR/Fのusebackqバージョンで立ち往生しています。
  3. 隠しフォルダ... .. .. .. ......これらのフォルダは期待される出力です_。
  4. ディレクトリフォルダ。.. .. .. .. .. ..これらのファイルは偽の結果であり、望ましくありません。

CMD行バージョン(またはサンプルDOSスクリプト)からの意図された結果は、< 3 >項目だけです。

W:..> for  /F "usebackq "  %f 
              IN (`dir /b /adh "w:\sandbox\tmp\"`)  DO echo ^ folder = %f
  folder = hidden-folder-01                   <3>
  folder = hidden-folder-02                   <3>

残念ながら、ターゲットフォルダ内の任意のファイルを取得することもできます。これもHIDDENスイッチ(/ ah)と関係があると思います。

設定したディレクトリにある非表示のフォルダ(ファイルではない)のみを一覧表示するにはどうすればよいですか。FORコマンドのようにリストを繰り返し処理しますか?

よろしくお願いします/

4

2 に答える 2

2

バッチファイルでは、/aとdhの間にスペースを入れないでdir /b /a dh "w:\sandbox\tmp\"ください。dir /b /adh "w:\sandbox\tmp\"スペースを使用すると、dirコマンドはdhをディレクトリまたはファイルペアマーとして解釈し、ファイルが見つからないというエラーの原因になります。

コマンドラインから実行しているときは、dirコマンドとは異なるパラメーターを使用しているdir /b /ah /ad "w:\sandbox\tmp\"ため、異なる出力が得られます。/ahと/adを別々のパラメーターとして使用すると、dirはディレクトリまたは隠しファイルであるものを表示する必要があると解釈し、/adhはディレクトリと隠しファイルの両方であるものを表示するようです。

また、すべての行に@を付ける必要はありません。ただし、ファイルの先頭で@echoをオフにすると、バッチファイル全体のコマンドエコーが無効になります。

于 2010-01-16T15:19:01.023 に答える
1

あなたは使用する必要があります

for  /F "usebackq delims=*"  %f IN (`"dir /b /adh "%1" 2>NUL"`)  DO @echo. folder = "%f"

それをするために。

2>NUL

エラーチャネル(ファイルが見つからないなど)が表示されず、NULL(NUL)を指していることを確認します

delims=*

ファイル名にスペースが含まれている場合でもスクリプトが機能することを確認します。ファイル名に「*」を含めることはできないため、すべてが見つかります。

これがあなたのために働くことを願っています、それは私のために働きました。

あなたの側で何かが変わった場合、フィードバックをお願いします。%fを使用せずに%aを使用した場合、出力に次の行が表示される理由がわかります。

folder = C:\WINDOWS\system32\cmd.exe        <2>

PCFreakに挨拶します

于 2011-04-28T08:13:38.230 に答える