0

非常に奇妙なエラーがあります。いくつかのファイルを 1 つのフォルダーにコピーして抽出するスクリプトを作成しましたが、その前に、次のように dir / old ファイルを削除します。

SET destinationFolder=C:\MyFolder

IF EXIST %destinationFolder% ( 
        ECHO rd %destinationFolder% /S /Q
        rd %destinationFolder% /S /Q
        IF %errorlevel% == 0 ( ECHO --^> SUCCEED ) ELSE ( ECHO --^> FAILED & set /a errorCount+=1 & ECHO %errorlevel% )
) ELSE ( ECHO --^> SUCCEED: No files existent )

これは、私が管理者として操作している場合はこれまでのところ機能しますが、管理者でない場合は期待できません。

管理者以外のシェルを開いて最初にバッチを実行すると (ファイルが存在しません)、同じシェルで繰り返し実行しても (同じバッチのファイルが存在します)、正常に動作します。

しかし、別の/新しい非管理者シェル(以前のシェルはもう実行されていません)を開いてスクリプトを実行すると(他のバッチの古いファイルが存在します)、最初にディレクトリが存在するかどうかを確認してもエラーレベル2が返されます.

そして、「最も面白い」ことは、rd %destinationFolder% /S /Qバッチ内で機能しなかった同じシェルでコマンドを実行すると、正常に機能することです!

4

2 に答える 2

0

変数の代わりにエラーレベルの値を使用できます

SET destinationFolder=C:\MyFolder

IF EXIST %destinationFolder% ( 
        ECHO rd %destinationFolder% /S /Q
        rd %destinationFolder% /S /Q || rem
        IF errorlevel 1 ( 
            ECHO --^> FAILED & set /a errorCount+=1 & ECHO %errorlevel% 
        ) ELSE ( 
            ECHO --^> SUCCEED 
        )
) ELSE ( 
    ECHO --^> SUCCEED: No files existent 
)

変数を使用する場合は、等号の前後にスペースを入れないようにし、%errorlevel% 変数に値がないようにしてください。明示的に設定されている場合 (0 に「初期化」されているのを見たことがあります)、コマンドからのエラー値は割り当てられません。

SET destinationFolder=C:\MyFolder

SET errorlevel=
IF EXIST %destinationFolder% ( 
        ECHO rd %destinationFolder% /S /Q
        rd %destinationFolder% /S /Q || rem
        IF not %errorlevel%==0 ( 
            ECHO --^> FAILED & set /a errorCount+=1 & ECHO %errorlevel% 
        ) ELSE ( 
            ECHO --^> SUCCEED 
        )
) ELSE ( 
    ECHO --^> SUCCEED: No files existent 
)

編集:

どちらのサンプルでも、rd の出力を別のコマンドにチェーンして、実行が失敗したときに実行する必要があります。これがないと、rd はエラー コードを返しません。

于 2013-10-22T08:12:06.993 に答える
0

このコードを変更

SET destinationFolder=C:\MyFolder
....
    rd %destinationFolder% /S /Q
    IF %errorlevel% == 0 (....

これに:

SET "destinationFolder=C:\MyFolder\"
....
    rd "%destinationFolder%" /S /Q || rem
    IF %errorlevel%==0 (....
于 2013-10-22T09:15:37.980 に答える