0

私はこのコードを持っています:

FOR %%d IN (c d e f g h i j k l m n o p q r s t u v w x y z) do (
        IF NOT EXIST %%d:\ (
            echo Free drive %%d
            set D=%%d:
        )
)

echo d=%D%
echo Using %D% to map remote drive
subst %D% /d
subst %D% \\path_to_drive

この後、D変数を使用して空きドライブをマップしています。問題は、これを最初に実行してドライブをマップしようとすると、スクリプトは D 変数が未定義であるか、何も含まれていないと見なすことです。スクリプトの終了時に値を出力すると、次のようになります。

set D

ドライブが見つかり、その値が得られたことがわかります。スクリプトをもう一度実行すると、期待どおりに動作します。バッチが変数が未定義であると考え、スクリプトの実行が終了した後、値があることに気が狂います。Dまた、これは変数が使用される唯一の部分でありALWAYS、少なくとも 1 つの空きドライブが存在することを付け加えたいと思います。そのため、使用可能なドライブがないという事実は正しくありません。

編集: ドライブのマップに使用する行を追加しました。

4

2 に答える 2

2

環境変数を正確に使用する場所によっては、これが発生する可能性があります。cmd は、コマンドの解析状態で環境変数を展開することに注意してください。また、括弧で囲まれたブロックを持つコマンドは、それ自体が 1 つの大きなコマンドです。したがって、上に投稿したのは1つのコマンドであり、コマンドが実行されたときではなく、 cmdが読み取ったときにすぐに環境変数が展開されます。

これを回避するには、

setlocal enabledelayedexpansion enableextensions

をバッチ ファイルの先頭に追加し、環境変数を!D!の代わりに使用します%D%

于 2009-11-12T09:18:11.713 に答える
1

これは私にとってはうまくいきます。セットアップでうまくいくかどうかを確認できますか? また、D を参照する方法を教えてもらえますか?

FOR %%d IN (c d e f g h i j k l m n o p q r s t u v w x y z) do (
        IF NOT EXIST %%d:\ (
                echo Free drive %%d
                set D=%%d:
        )
)
echo %D%
于 2009-11-12T09:34:54.743 に答える