2016-12-19 3 views
0

これは重複した質問ではありません(驚いたことに)。私はバッチファイルを使用するファンではなく、作成する回数を1つの手に数えることができます。Windowsバッチファイル - Y/Nプロンプトで削除し、ワイルドカードを許可しない

私は一度に1ファイル、を削除するためのバッチファイルを作成しようとしています。ワイルドカードはありません。ファイル名が存在しない場合、バッチファイルは終了する必要があります。

私の誤ったバッチファイル:

@echo off 
set /p image="Enter file name (e.g. car.jpg):" 
set fullFileName=C:\testimages\%image% 

IF EXIST "%fullFileName%" (
    ECHO[ 
    del /P /F "%fullFileName%" 
) ELSE (
    ECHO File %fullFileName% doesn't exist 
) 

pause 

正しい:

Enter file name (e.g. car.jpg):car.jpg 

C:\testimages\car.jpg, Delete (Y/N)? 

正しい:

Enter file name (e.g. car.jpg):plane.jpg 
File C:\testimages\plane.jpg doesn't exist 
Press any key to continue . . . 

私は任意のワイルドカードを禁止します。次のように:

Enter file name (e.g. car.jpg):* 

C:\testimages\bus.jpg, Delete (Y/N)? n 
C:\testimages\car.jpg, Delete (Y/N)? n 
C:\testimages\truck.jpg, Delete (Y/N)? n 
Press any key to continue . . . 
+0

ユーザーがワイルドカードを入力するとどうなりますか? – SomethingDark

+0

バッチファイルを終了する必要があります。 "%% B" NEQ "" goto:EOF " – user3541092

答えて

2

*または?を入力することを禁止するとします。しかし、文書化されていない他のワイルドカードもあります。

@echo on 

:loop 
cls 
set /p "image=Enter file name (e.g. car.jpg):" 

(echo "%image%"|findstr /L "* ? < > ^" >nul 2>&1) && GOTO :EOF 

set "fullFileName=C:\testimages\%image%" 

IF EXIST "%fullFileName%" (
    ECHO[ 
    ECHO del /P /F "%fullFileName%" 
) ELSE (
    ECHO File "%fullFileName%" doesn't exist 
) 
endlocal 
pause 

おそらく入力の検証のためのより堅牢な方法があります。私はこれが何らかの形で壊れる可能性があると確信しています。ここで

+0

も' for/F "tokens = 1 * delims =?*"%image% "すべてのインスタンス。私は実際に最初のコードセットでFOR/Fをやっていました。 – elzooilogico

+1

@elzooilogicoで動作しない場合は、 – Squashman

+0

すべてのケースをテストしませんでした。私は決して 'findstr'の'/L'スイッチを使用することはありません。いいね。 – elzooilogico

2

for /Fコマンドを使用してオプションです:

set "image=" & set /P image="Enter file name: " 
for /F tokens^=1*^ delims^=?*^<^>^" %%A in ("_%image%_") do set "TEST=%%B" 
if defined TEST echo There are wild-cards! 

少なくとも一つのワイルドカードが%image%に存在する場合、%%Bので、TESTは空ではありません。ワイルドカードは、%image%の最初と/または最後にしか存在しない場合に、失敗しないように、_の文字が先頭に追加され、追加されます。


これは標準forループを使用して別のオプションです:

set "image=" & set /P image="Enter file name: " & set "FLAG=#" 
for %%A in ("%image%") do if /I "%image%"=="%%~nxA" (set "FLAG=") else goto :QUIT 
:QUIT 
if defined FLAG echo There are wild-cards! 

少なくとも一つのワイルドカードが%image%に存在する場合、forループはファイルシステムにアクセスし、マッチングを返すことによって、それを解決します項目(ゼロ以上)。これは、元の文字列%image%が反復された項目のどれとも等しくないので、ifクエリが失敗することを意味します。 gotoにはそれ以上の反復を避けるためにループが壊れることがあります。一致する項目がない場合、ループはまったく反復しません。 %image%にワイルドカードが存在しない場合、forループは元の文字列に1回だけ反復されるため、ifの条件が満たされ、変数FLAGがクリアされます。

関連する問題