2

取得したドライブ文字に関係なく、バッチ ファイルを使用してリムーバブル ドライブからファイルをコピーしたいと考えています。

これまでのところ、行きません。ボリューム ラベルに基づいてパスを処理する、すぐに利用できるコマンドやサードパーティのコマンド ライン ツールはないようです。

FreeFileSync を試してみましたが、大きなバッチで動作し、ここでは正確なファイル操作が必要です。また、削除は行われず、ペンドライブからファイルを移動する必要があります。

しかし、私の興味をそそるのは、次のような無意味なコマンドを発行することです...

C:\> cd MYPENDRIVE:

...デフォルトのエラーメッセージに非常に興味深いビットが表示されます。

The filename, directory name, or volume label syntax is incorrect.
                                 ^^^^^^^^^^^^^^^^^^^

このメッセージが信頼できるものであるとすれば、そこにボリューム ラベルを配置するための正しい構文があることを意味します。それともありませんか?

注: 必要に応じて、小さな "getdriveletterforvolume" ツールを作成することで解決できますが、車輪の再発明はしたくありません。また、長時間のバッチ ファイル操作中に、ドライブが取り外されて別のドライブに置き換えられる場合があります。その時点で、操作を停止し、同じドライブ文字を取得する別のドライブで続行しないようにする必要があります。

注 2: \\?\Volume{12345678.....} を使用するのは最後の手段ですが、ある程度調整することはできますが、...

SET PENDRIVE=\\?\Volume{949a764e-a2f0-11e3-b710-6cf04975450b}
SET BACKUPDRIVE=\\?\Volume{e79091c4-5c2a-11e3-86f9-806e6f6e6963}

if exist %PENDRIVE% {
  if exist %BACKUPDRIVE% {
    move %PENDRIVE%\*.* %BACKUPDRIVE%
  }
}

...しかし、それは醜く、2つのペンドライブに同じラベルを付けて同じように動作させるような魔法を行うことはできません。一般的なケースではないことはわかっていますが、すぐに解決できる可能性がある場合に、選択肢を制限する必要はありません。


編集:進行状況。VOLUMEID として値を返すようにサブルーチンを変更しました。

CALL :GetVolumeID PENDRIVE
SET "PENDRIVE=%VOLUMEID%"
IF EXIST "%PENDRIVE%\" ECHO PENDRIVE is connected at %PENDRIVE%!

GOTO :eof

:GetVolumeID
FOR /F "skip=1" %%A in ('"wmic volume where label='%~1' get deviceid 2>/null"') do (
 SET "VOLUMEID=%%A"
 GOTO :eof
)
GOTO :eof

...しかし、ペンドライブが見つからない場合は、wmic空のような値(空の文字列ではなく、if %%A==""チェックに失敗します)を返すため、最終的にIF EXIST \trueになります。そのような空の結果を削除するにはどうすればよいですか..? SET VOLUMEID=$FOO$の前に試しましたFORが、とにかく空の値で上書きします。


ついに!これが役立つと思う人のための概念実証です。

@ECHO OFF

CALL :GetVolumeID BACKUPDRIVE
SET "BACKUPDRIVE=%VOLUMEID%"

CALL :GetVolumeID PENDRIVE
SET "PENDRIVE=%VOLUMEID%"

if exist %PENDRIVE%\ (
    if exist %BACKUPDRIVE%\ (

        echo Emptying the pendrive.

        move %PENDRIVE%\*.* %BACKUPDRIVE%\pendrive\
    )
)

GOTO :eof

:GetVolumeID
SET VOLUMEID=$$$
FOR /F "tokens=1,* delims==" %%A IN ('"wmic volume where label='%~1' get deviceid /value 2>nul"') DO  IF NOT "%%~B"=="" SET "VOLUMEID=%%~B"
SET "VOLUMEID=%VOLUMEID:~0,-2%"
GOTO :eof

EXIST チェックに失敗するために返される $ 偽の値を追加しました。最後の SET VOLUMEID=%VOLUMEID... 行では、末尾のバックスラッシュが削除され (何らかの理由で 2 文字としてカウントされます)、パスが正常に%MYDRIVE%\file*.*見えるようになります。

4

2 に答える 2

2

これは、名前でドライブを指定するサブルーチンですpush。1 つの引数 (ドライブ ラベル) を取ります。

@echo off

:pushToLabel label 

setlocal
for /f "skip=1 delims=:" %%A in ('"wmic logicaldisk where VolumeName='%~1' get name"') do (
 set "drive=%%A:"

 goto :break
)
:break
echo %drive%
endlocal && (
    pushd %drive%
)
于 2015-02-04T16:23:16.077 に答える