2

次のファイルを含むディレクトリがあるとします。

Test.bat Test_a.txt Test_b.txt Test_v1.zip Test_v2.zip Test_v3.zip

Test_v*.zipすべてを静かに削除したい(画面にエラー メッセージが記録されない)。次のスクリプトでこれを実現できます。

@ECHO OFF
SET OLD_ZIPS=^
C:\Tmp\Test_v*.txt;^
C:\Tmp\Test_a.txt

ECHO Deleting the following files: %OLD_ZIPS%

FOR %%Y IN (%OLD_ZIPS%) DO (
IF EXIST %%Y (
ECHO  Deleting %%Y
DEL /Q %%Y)
)

PAUSE

これはうまくいきます:

Deleting the following files: C:\Tmp\Test_v*.txt;C:\Tmp\Test_a.txt
Deleting "C:\Tmp\Test_v1.txt"
Deleting "C:\Tmp\Test_v2.txt"
Deleting "C:\Tmp\Test_a.txt"
Press any key to continue . . .

もちろん、ファイルパスにスペースが含まれていない限り。したがって、上記の例で、次のように変更C:\Tmp\Test_v*.txtすると、次のようC:\Tmp with spaces\Test_v*.txtになります。

Deleting the following files: C:\Tmp test\Test_v*.txt;C:\Tmp test\Test_a.txt
Press any key to continue . . .

どうすればスペースでボーキングするのを止めることができますか?

編集- Alex K's answer (およびもう少しデバッグ) に従ってスペースを試してみましたが、おそらく for ループが期待どおりに分割されていないようです:

@ECHO OFF
SET OLD_ZIPS=^
C:\Tmp test\Test_v*.txt;^
C:\Tmp test\Test_a.txt

ECHO Deleting the following files: %OLD_ZIPS%

FOR %%Y IN (%OLD_ZIPS%) DO (
ECHO  Checking existance of "%%Y"
IF EXIST "%%Y" (
ECHO  Deleting "%%Y"
DEL /Q "%%Y")
)

PAUSE

..私に与えます:

Deleting the following files: C:\Tmp test\Test_v*.txt;C:\Tmp test\Test_a.txt
 Checking existance of "C:\Tmp"
 Checking existance of "C:\Tmp"
 Checking existance of "test\Test_a.txt"
4

3 に答える 3

2

物事を過度に複雑にしようとしているようです。

for %a in ("C:\Tmp with spaces\Test_v*.txt" "C:\Tmp\Test_a.txt") do del /q "%a"

必要なことを実行し、コマンド ラインから入力できます。バッチファイルで実行する場合は、 %a を %%a に変更します

于 2012-09-19T18:28:11.917 に答える
1

関数は各行を個別にループする必要があるため、FOR ループで変数を引用し、セミコロンでトークン化し、すすぎ、繰り返す必要があります。

@ECHO OFF
SET OLD_ZIPS=^
C:\tmp with spaces\Test_v*.txt;^
C:\tmp\Test_a.txt

ECHO Deleting the following files: %OLD_ZIPS%

:deleteFiles
for /f "tokens=1* delims=;" %%A in ("%OLD_ZIPS%") do (
    ECHO  Checking existance of "%%A"
    IF EXIST "%%A" (
        ECHO  Deleting "%%A"
        DEL /Q "%%A"
    )
    set OLD_ZIPS=%%B
)
if not "%OLD_ZIPS%" == "" goto :deleteFiles

PAUSE
于 2012-09-19T18:14:13.853 に答える
-1

奇妙なことに、これはうまくいくようです。自分のバージョンをあなたのバージョンのように編集したので、構文エラーを修正してみてください ;-)

@ECHO OFF
SET OLD_ZIPS="C:\Tmp with spaces\Test_v*.txt";^
"C:\Tmp with spaces\Test_a.txt";

ECHO Deleting the following files: %OLD_ZIPS%

FOR %%Y IN (%OLD_ZIPS%) DO (
IF EXIST %%Y (
ECHO  Deleting %%Y
DEL /Q %%Y)
)

PAUSE
于 2012-09-19T16:54:54.437 に答える