0

このコードを使用して、ある場所から別の場所にファイルをコピーしたいとします。

@set FILE=%1
@set SCRDIR=C:\test dir
@set DSTDIR=%SCRDIR%\temp

for %%f in ("%SCRDIR%\%FILE%") do @(
    echo Copying "%%f" to "%DSTDIR%"
    copy "%%f" "%DSTDIR%"
)

ファイルが存在します:

 C:\test dir>dir /b copyme.txt
copyme.txt

まず、コピーしたい引数としてファイルの名前を使用してスクリプトを呼び出します。

C:\test dir>test.bat rename.txt

C:\test dir>for %f in ("C:\test dir\rename.txt") do @(
echo Copying "%f" to "C:\test dir\temp"
 copy "%f" "C:\test dir\temp"
)
Copying ""C:\test dir\rename.txt"" to "C:\test dir\temp"
The system cannot find the file specified..

上記のコピーコマンドは、余分な引用符が原因で失敗します...

ここで、ワイルドカードを含むファイル名でスクリプトを呼び出します*

C:\test dir>test.bat copyme.*

C:\test dir>for %f in ("C:\test dir\copyme.*") do (
echo Copying "%f" to "C:\test dir\temp"
 copy "%f" "C:\test dir\temp"
)

C:\test dir>(
echo Copying "C:\test dir\copyme.txt" to "C:\test dir\temp"
 copy "C:\test dir\copyme.txt" "C:\test dir\temp"
)
Copying "C:\test dir\copyme.txt" to "C:\test dir\temp"
        1 file(s) copied.

上記の例では、ワイルドカードを使用している場合、完全に正常に機能します。

誰かがこの行動を説明できますか?ワイルドカードを使用していないのに、Windowsが余分な引用符を追加するのはなぜですか?または、ワイルドカードを使用しているため、余分な引用符を省略していますか?FOR空白を含むパスを処理するには、ループのpath \ filenameを引用符で囲む必要があるため、これらを省略することはできません。

4

1 に答える 1

1

ワイルドカードがない場合、forコマンドはファイルが存在するかどうかをチェックしないため、その名前を引用符を含む文字列リテラルとして効果的に扱います。"%%~f"代わりに使用するだけです"%%f"

于 2012-06-06T13:44:54.623 に答える