4

私はバッチ(cmd)で次のコードを持っています:

for /f "delims=" %%f in ('dir /b /s Example') do (
command
if %errorlevel%==1 (
command
SKIP
)
command
)

EDIT: より明確に するために: for /f...「Example」というディレクトリを検索し、ループして複数のディレクトリを検索します。最初commandは削除コマンドで、ディレクトリ内のすべてのファイルを削除します。commandエラーが発生したときに発生するのは、エラーechoに関する情報をテキスト ファイルに書き込むコマンドです。今、穴のskipこと。access deniedまたはが原因でファイルを削除できない場合がありますthis file is in use by...。通常、スキップがない場合は、コマンドが停止してハングするだけです。だから、私がやりたいことは、これが起こらないようにすることです。または、次のようなものを使用したいskipので、ファイルをスキップして続行できます。したがって、このコマンドはコマンドにパイプする必要があると思いますdelete

私はそれが今明確であることを願っています。

前もって感謝します。

4

8 に答える 8

3

このような?

for /f "delims=" %%f in ('dir /b /s Example') do (
  command
  if not errorlevel 1 (
    command-for-success
  ) else (
    command-for-error
  )
)
于 2009-12-27T18:42:40.473 に答える
2

2 つのコマンド ファイルを作成し、delex.cmd を実行します。削除されていないファイルとディレクトリは、delex.txt に記録されます。ハングしたものは、最小化された cmd ウィンドウが開き、ping を使用して遅延後に強制終了されます (Doc Brown の提案に感謝します)。

delex2.cmd
----------
@echo off
del /q %1 
if exist %1 echo %1 not deleted!>>delex.txt 
exit 

delex.cmd
---------
@echo off
if exist delex.txt del delex.txt 
for /f "delims=" %%f in ('dir /s /b example') do start "delextaskkill" /min delex2.cmd "%%f"
ping 127.0.0.1 -n 3 -w 1000> nul
taskkill /fi "Windowtitle eq delextaskkill"> nul

テスト済み:

\example
|   file1
|   file2
|   file3
|   file4
|   file5
|
\---example
        file1
        file2
        file3
        file4
        file5
于 2010-01-04T03:10:30.410 に答える
0

私はこれがあなたが望むものだと信じています

for /f "delims=" %%f in ('dir /b /s Example') do (
  command
  if not errorlevel 1 (
    command
  ) else (
    command
    goto :eof
  )
)
于 2010-01-03T18:17:01.847 に答える
0

このバッチファイルを試してください:

@echo off
REM For each directory named 'Example' ...
for /f "delims=" %%f in ('dir /b /s Example') do (
    REM .. enter the directory and delete all the files found there.
    pushd .
    cd %%f
    del /q *
    for /f "delims=" %%z in ('dir /b') do (
        REM Any files that still exist must have been inaccessable.  Log an error.
        echo Unable to delete file %%z > C:\logfile.txt
    )
    popd
)

次のディレクトリ構造でテスト済み:

folder\
|------Example\
|      |-------file1 (write-protected)
|      |-------file2
|      |-------file3
|------deeper\
       |-------Example\
               |-------file4
               |-------file5 (write-protected)
               |-------file6

バッチファイルを実行するfile1と、 とだけfile5が残りました。書き込み保護されたファイルが検出されるたびに、「アクセスが拒否されました」というメッセージが出力されました。それが煩わしい場合は、バッチファイルの出力をリダイレクトscript.bat > NULして非表示にします。

于 2010-01-06T19:20:40.003 に答える
0

したがって、既存のすべての回答があなたを満足させず、バッチファイル内で絶対にスキップする必要がある場合は、もう一度試してみます:

@echo off
setlocal

for /f "delims=" %%f in ('dir /b /s batch') do call :DoSomething %%f
goto end

:DoSomething
echo Here i am: %1
if %errorlevel%==1 goto :eof

echo No error occured
goto :eof

:end
endlocal

秘訣は、for ループが同じファイル内のサブ関数を呼び出し、それに必要なパラメーターを与えることです。do call :DoSomethingこの新しい呼び出しは新しいコンテキストで実行され、指定された順序で後に定義された変数にのみアクセスできます。

%1したがって、ここで、などを使用して変数にアクセスする必要があります%2。このコンテキストを離れたい場合goto :eofは、ファイルの最後にジャンプする必要があります (このマーカーはバッチ モードで事前定義されており、ファイル内では発生しないはずです)。コンテキストを離れて for ループに戻るもの。

ループ全体を実行した後、:endマーカーにジャンプし、少しクリーンアップして終了します。

于 2010-01-07T11:55:32.140 に答える
0

おそらく、これは、組み込みの cmd 処理を使用して達成できるよりも高度です。Windows Scripting Host (vbscript/jscript) や PowerShell の使用を検討してみませんか? どちらも、要求しているレベルの制御を提供する可能性があります。

于 2010-01-04T03:22:41.273 に答える
0

以下は、"dirname" ディレクトリ ツリーの下で必要なファイル拡張子を再帰的に検索し、そのファイル名に対して commandstuff.bat を実行します。

for /r %i in (c:\dirname\*.ext) do commandstuff "%i"

Commandstuff.batは次のようになります。

@ECHO OFF
del %1
IF (%ERRORLEVEL% == 0) goto END
:ERROR
エコーエラー %1 の削除

:END
エコー終了

これにより、commandstuff.bat が実行され、必要なファイルが削除されます。エラーが発生した場合、ファイルの詳細を単にエコーし、次のファイルの処理を続行します。

于 2010-01-07T12:12:26.900 に答える