2016-10-22 22 views
0

私はDropboxをインストールしましたが、探していたものに対応していなかったので、Revo Proでアンインストールしました。 しかし、私はtaskmanagerを開いてもまだ私のコンピュータで実行されているプロセスに関連しているので、それに関連するすべてのファイルを見て削除するようにバッチを作ることにしました。%errorlevel%はループコマンドで0を返します

@echo off 
    cd c:\ 
    :a 
    set /p a=Phrase that might be realted to it 

    for /r %%d IN (*.*) DO (
     (
     findstr /i /m /c:%a% "%%d" 
     if "%errorlevel%"=="0" del "%%d" 
     echo %errorlevel% 
     ) 
    ) 

    pause 

問題がある:私は%ERRORLEVEL%を0として返しますがanalizedファイルで私の変数「%%」のための一致がない場合でも、ループを使用します。findstr実行したときに、私はfindstrの一人で、そこに使用する場合一致しません%ERRORLEVEL%は一致すると1と0を返します。 私はそれを使用すると、私はすべての自分のPCファイルを削除します。コードの何が間違っていますか?

+3

可能な複製(HTTP [Windowsのバッチ変数は設定しません]:/ /stackoverflow.com/questions/9681863/windows-batch-variables-wont-set) – SomethingDark

+0

variabブロック内のファイルは1回だけ評価されます。 'setlocal enabledelayedexpansion'を使い、'%errorlevel% 'を'!errorlevel! 'に変更して、各繰り返しに対して評価された値を取得する必要があります。 – elzooilogico

+0

実行中のプロセスの実行可能ファイルを削除することはできません。実行中のプロセスについては、スクリプトは何もしません。コンピュータを再起動し、離れたかどうかを確認してください。そうでない場合は、Dropboxを再インストールし、サードパーティ製のプログラムではなく、独自のアンインストーラを使用して正しくアンインストールしてください。 –

答えて

0

コードに何が問題なのかよく分かりませんが、おそらく& &オペランドを使用してスキップすることができます。

findstr /i /m /c:%a% "%%d" && del "%%d" echo %errorlevel% 

例を修正してくれたStephanに感謝します。

+0

ああ、助けてくれてありがとう。しかし、正確に&&オペラントは何ですか? –

+0

@AdrianoAraujo:[here](http://ss64.com/nt/syntax-redirection.html)を参照してください。それは "以前のコマンドが成功した場合は、"として機能します。 Galra: '&&'の後に '%% errorlevel%== 0'が続くのは意味をなさない。どちらか一方を使用してください。 – Stephan

+0

オグ、それは完全に助けてくれました –

1

括弧で囲まれた一連のステートメント内で、%var%は、そのステートメントシーケンスを制御する動詞(またはblock)に遭遇したときにその変数の値に置き換えられます。

ここで、ブロックはforによって制御されるステートメントのシーケンス全体です。 forに遭遇した時点で%errorlevel%errorlevelのステータスに置き換えられます。おそらく0です。

あなたは

findstr /i /m /c:%a% "%%d" 
    if not errorlevel 1 del "%%d" 
    echo %errorlevel% 

を使用する場合は、errorlevelrun-time値が使用されている(すなわち、ループの操作により変更される)とerrorlevelは、(1 またはより大きくない場合、コマンドは」意味1)がこれを行う...」

findstrはため、foundに0にnot found12errorlevelを設定します(IIRC)はNOT(1以上)は0のみを選択します。特定の難解な状況では、errorlevelが負になることがありますが、findstrの後には、0..2が許容範囲であると考えられます。

0

Windowsコマンドインタプリタが(は、コマンド・ブロックの開始として解釈される遭遇するたびに、それはコマンドブロックの終わりをマーク)に一致するまでの全体のコマンドブロックを解析し、変数の現在の値によってすべて%variable%を置き換えます。

これは FORコマンドが実行される最初の時間になる前に、(からすべてが)最後までを行うことを、この場合には意味は、適切な変数の現在の値によって、すべての%variable%参照を交換すると、既に処理されます。その後、既にプリプロセスされたブロックは、(コマンドIF)以上(コマンドの場合)に実行されます。

この現象は、バッチファイルをデバッグすることによって確認できます。バッチファイルをデバッグするには、最初に@echo offを削除するか、コマンドREMでコメントアウトするか、@echo onに変更する必要があります。コマンドプロンプトウィンドウを開き、パスまたは名前にスペース文字が含まれている場合は、二重引用符で囲んだ完全パスで名前を入力して、このコマンドプロンプトウィンドウ内からバッチファイルを実行する必要があります。 Windowsコマンドインタープリタは、実行前にすべてのコマンドラインとコマンドブロックを表示します。もちろん、バッチファイルで構文エラーが発生した場合は、コマンドまたはWindowsコマンドインタープリタ自体が出力する標準メッセージとエラーメッセージも表示されます。コマンドプロンプトウィンドウを開く

にオプション/Kcmd.exeを実行している意味コマンドの実行やバッチスクリプトの後に開いているウィンドウしてください。バッチファイルをダブルクリックすると、バッチファイルの処理にはが起動しますが、パラメータが/Cになります。バッチ処理後に自動的にウィンドウが終了します。

バッチファイルを実行する前に開いたコマンドプロンプトウィンドウは、バッチ処理が正常に終了した後、またはバッチファイル以外のコマンドEXITがパラメータ/Bなしの場合を除いて開いたままです。したがって、バッチファイルの専門家は、テストバッチファイルをダブルクリックするのではなく、コマンドプロンプトウィンドウ内から実行することによって、常にそれらを実行します。

コマンドのプロンプトウィンドウset /?で実行中の出力SETの出力の助けによって説明されているように、同じコマンドブロック内で設定または変更され参照される変数には、遅延可変拡張が必要です。

@echo off 
setlocal EnableDelayedExpansion 
cd /D C:\ 
:a 
set /P "a=Phrase that might be realted to it: " 

for /r %%d in (*) do (
    %SystemRoot%\System32\findstr.exe /i /m /c:"%a%" "%%d" 
    if "!errorlevel!" == "0" del "%%d" >nul 
) 
endlocal 

しかし、前のコマンドの終了コードをチェックするためとしてサポート記事Testing for a Specific Error Level in Batch Filesにマイクロソフトによって説明if errorlevel構文もあります。

@echo off 
setlocal EnableDelayedExpansion 
cd /D C:\ 
:a 
set /P "a=Phrase that might be realted to it: " 

for /r %%d in (*) do (
    %SystemRoot%\System32\findstr.exe /i /m /c:"%a%" "%%d" >nul 
    if not errorlevel 1 del "%%d" >nul 
) 
endlocal 

if errorlevel X試験前のコマンドまたはそれが全くエラーレベルの変数を変更し、アプリケーションの終了コードが大きいかX等しい場合。 if not errorlevel Xを使用すると、最後の終了コードがXよりも小さいかどうかがチェックされます。ここでは、終了コードが0の場合のテストです。

使用されているコマンドとその動作を理解するには、コマンドプロンプトウィンドウを開き、コマンドごとに表示されているヘルプページ全体を非常に慎重に読むことができます。

  • cd /?
  • del /?
  • echo /?
  • for /?
  • if /?
  • set /?

も見

関連する問題