0

次のようなソリューションを使用して、ドラッグ アンド ドロップの選択範囲から複数のファイルとフォルダーをコピーしようとしています。

mkdir newdir
for %%a in ("%*") do (
echo %%a ^ >>new.set
)
for /f "tokens=* delims= " %%b in ('type "new.set"') do (
SET inset=%%b
call :folderchk
if "%diratr%"=="d" robocopy "%%b" "newdir" "*.*" "*.*" /B /E && exit /b
copy /Y %%b newdir
)

exit /b

:folderchk
for /f tokens=* delims= " %%c in ('dir /b %inset%') do (
set atr=%~ac
set diratr=%atr:~0,1%
)

次の例のコードをまとめてみましたが、行き詰まっています。

http://ss64.com/nt/syntax-dragdrop.html

複数のファイルのバッチ ファイルをドラッグ アンド ドロップしますか?

複数フォルダ内の複数ファイルの一括処理

4

1 に答える 1

1

Drag&Drop での特殊文字の処理は、信頼できる方法で引用されていないため、注意が必要です。

スペースを含むファイル名は自動的に引用されるため、スペースはそれほど複雑ではありません。
しかし、感嘆符とアンパサンドという 2 つの特殊文字が問題を引き起こす可能性があります。

アンパサンドを含む名前は自動的に引用されないため、この方法でバッチを呼び出すことができます

myBatch.bat Cat&Dog.txt

これにより、2 つの問題が発生します。まず、パラメーターが完全ではありません。
In %1and also in%*はテキストのみでCat&Dog.txtパーツは通常のパラメーターではアクセスできませんが、変数を介してアクセスできcmdcmdlineます。
これは遅延展開によって展開する必要があります。そうしないと、感嘆符とキャレットがファイル名から削除される可能性があります。
バッチが終了したら、exitコマンドを使用して cmd ウィンドウを閉じる必要があります。そうしないと、コマンド&Dog.txt実行され 、通常はエラーが発生します。

したがって、ファイル名リストの読み取りは次のようになります

@echo off
setlocal ENABLEDELAYEDEXPANSION
rem Take the cmd-line, remove all until the first parameter
set "params=!cmdcmdline:~0,-1!"
set "params=!params:*" =!"
set count=0

rem Split the parameters on spaces but respect the quotes
for %%N IN (!params!) do (

  echo %%N
)

pause
REM ** The exit is important, so the cmd.ex doesn't try to execute commands after ampersands
exit

これは、参照したリンクでも説明されていますDrag and drop batch file for multiple files?

于 2012-07-03T11:46:04.377 に答える