web-dev-qa-db-ja.com

バッチで、ドライブ文字の代わりにボリューム名を使用するパスを指定するにはどうすればよいですか?

バッチで、ドライブ文字の代わりにボリューム名を使用してパスを指定する方法はありますか?(例:\\ RECOVERY\Docs\...)

または、不可能な場合は、特定のボリューム名が特定のドライブ文字に属しているかどうかを確認する方法はありますか(たとえば、F:\がRECOVERYの場合は、これを実行します)

これが私がやりたいことです:あるドライブを別のドライブにバックアップするバッチを作成しますが、両方のドライブ(ソースと宛先)がリムーバブルUSBドライブ上にあるため、ドライブ文字が決して変更されないことを確信できません。バックアップを反対ではなく作業フォルダにコピーすると、壊滅的な障害が発生します。

1
tigrou

個人的には、WMI(cmdが必須の場合はwmic)を使用して、そこからラベル->ドライブ文字のリンクを取得します。難しいことではありませんが、非常に脆弱なバックアップ操作では、バッチファイルが最善の解決策ではない可能性があるというコメントに同意します。そうは言っても、ここにすばやく到達するためのロジックは次のとおりです。

@echo off
set VAR=Source
for /f "skip=1" %%L in ('wmic logicaldisk where volumename^="SourceLabel" Get Caption') do @call :SetVar %%L
set VAR=Destination
for /f "skip=1" %%L in ('wmic logicaldisk where volumename^="DestinationLabel" Get Caption') do @call :SetVar %%L

echo Copying data from %Source% to %Destination%
goto :EOF

:SetVar
set Label=%1
if NOT [%Label%]==[] set %VAR%=%Label%
goto :EOF

SourceLabelを、宛先ラベルと同じソースドライブの実際のラベルに置き換えるだけです。 echoコマンドで正しい参照を取得したら、それと「goto:EOF」ディレクティブの間に他のロジックを配置できます。

2
BartekB