2009-08-14 5 views
0

私は裁判と些細なバッチスクリプトをerroringよそれ自身と他の2つのファイル。バッチスクリプトIF

これは動作します:

@echo off 
for /f %%f in ('dir /b c:\d\test') do (del %%f) 

これにはない:

@echo off 
for /f %%f in ('dir /b c:\d\test') do (if (true) (del %%f)) 

なぜ? (「場合(真)」私は、など「== 『FOO』やファイル名== 『バー』のファイル名でない場合は、」言いたいの代わりに)

多くは感謝あなたの

EDIT: @rangerchris、完璧、ありがとう。今や反復にフォルダとサブフォルダを含める方法は?コマンドラインから

+0

@ポン - あなたはちょうどdirをすることはできません/ s/b c:\ some \ file \ path? .../sはdirに再帰を伝えるべきです。次に、ファイル名ではなくフルパスを含めるようにIFを適切に拡張します。 –

答えて

1

Pong、このコードでは、必要なファイル名で「Keep」変数を入力します。

私はこれらのファイルがどこにあっても大丈夫だと私は確信しています。実際にはパスではなく名前+拡張子のみをチェックしています。

EDIT: [OK]をクリックして、Pongの改訂版を公開します。あまりにも急いで投稿して申し訳ありませんが、私のスクリプトを十分にテストしなかったと推測します。この時間が、

、私は例や再帰的プログラミング(機能:CleanDirsが自分自身を呼び出す)を表示することができますXPバッチプログラミングに:)

Cleanup.cmd:

@echo off 
set Keep="%~nx0" "file1.ext" "file2.ext" 
set StartDir=%~dp0 
call :CleanDirs "%StartDir:~0,-1%" 
exit /b 0 
:CleanDirs 
    call :CleanFiles "%~1" 
    for /f "delims=" %%d in ('dir /ad /b "%~1"2^>nul') do call :CleanDirs "%~1\%%~d" 
    if exist "%~1" rmdir /Q "%~1">nul 2>nul 
    exit /b 0 
:CleanFiles 
    for /f "delims=" %%f in ('dir /a-d /b "%~1"2^>nul') do (
     set _keep= 
     for %%k in (%Keep%) do if /i "%%~nxf"=="%%~k" set _keep=yes 
     if not defined _keep del /f "%~1\%%~f" 2>nul 
    ) 
    exit /b 0 

それでも、これが役に立てば幸いさらに。

ノート

セットは =キープ:あなたは維持する必要がある任意のファイル名で調整します。スクリプトは、これらのファイルを保持するサブフォルダを保持します。

StartDir =%〜dp0:スクリプトが見つかったときに自動的に設定されます。あなたが他の場所でスクリプトを移動したい場合は、引数としてディレクトリ名とそれを呼び出し、「約1%」

コーディングのヒント

=として、ここで逢引を変更することができます*〜 * 1:(Tild)囲み引用符を削除します。すべての引用符を削除せず、1つの先頭/末尾のみを削除します。

%〜NX0:(tild N x)は、ファイルのn雨+バッチファイルの電子Xトンを取得します。これを関数に入れると、これは変更されます。必要に応じて調整します。 〜DP0

%:(tild dpが)バッチファイルの末尾のバックスラッシュ(\)を含むDリヴ/フルP ATHを(取得警告これは関数に入れている場合、これは変更されます。必要に応じて調整し

%STARTDIR:〜0 、-1%:ここ(Tildスタート、ストップ)は、変数の部分文字列を取得し、位置0から最後の文字にマイナス末尾を取り除くために使用される一つの位置を( \)。

+0

これは有望に見えますが、うまくいきません。上記のスクリプトを(変更なしで)実行すると、file1.extとfile2.ext以外のすべてを削除する必要がありますか?まあ、それは何も削除しません。好奇心。 –

+0

私は間違っている参照してください、コードを修正します。 – Jay

+0

Jay、これは空のフォルダだけを削除します。最後の編集は1回ですか?そうでなければそれは素晴らしい作品です - ありがとう! –

0

、それはここで大丈夫動作します:明らかに

for %i in (*) do if not "%i" == "startgd.bat" echo %i 

、変更%でも、私は.BATファイルに私を%%します。どのようなエラー(もしあれば)を取得していますか?たぶん、あなただけ正しく引用符を使用する必要が

EDIT(単一ではなく、二重引用符を?): を2つのファイルを無視するために、これは動作します:

for %i in (*) do if not "%i" == "startgd.bat" if not "%i" == "msdelog.log" echo %i 

EDIT 2 [@ポンの編集に基づいて、これを完全に行う]: フォルダを再帰的に処理するには、/ sスイッチをdirに渡すだけです。これは動作するはず

for /f %i in ('dir /s /b c:\') do if not "%i" == "C:\startgd.bat" if not "%i" == "c:\path\to\other\file" echo %i 
+0

@ポン - 答えが編集されました。これでうまくいかなければ、達成しようとしていないことの詳細を教えてください。いずれにせよ、これはソリューションを提供するために必要な基礎ツールを提供するはずです。 –

+0

その中のファイルだけでなく、フォルダも削除する必要があります –

+0

アイテムがバッチスクリプトのファイルまたはディレクトリであるかどうかを判断することはできません。 rmdir(rmdir/sはすべてのファイルと関連するサブフォルダを削除します)に基づいて何かをやってみることができます。最初に保存したいファイルを2つバックアップして、一度復元することができます。それでは、/ some/path/file1/backup/file1 ...コピー/ some/other/path/file2 .../backup/file2 ... rmdir/q/s/some ... mkdir/some/other/path ...ファイルを元に戻します。 –

0

for /f %%f in ('dir /b c:\d\test') do (if '%%f' == 'foo' del %%f) 

は基本的に、あなたはあなたの条件テストに変数を引用する必要があるので、あなたのようなものがあるでしょう。

関連する問題