2008-09-06 8 views
7

文字が変わる可能性のあるドライブを参照しようとしています。私はそのラベル(例えば、バッチファイル内のMyLabel(v :):V:\で参照することができます)を参照したいと思います。ラベルのみに基づいてドライブを参照/選択しますか? (ドライブ文字ではない)

これは、無応答と月の専門家Echangeに掲載されました。のは、SO、それに答えるどのくらいの速見てみましょう)

答えて

1

このbatファイルは、あなたのドライブラベルからドライブ文字与える:

Option Explicit 
Dim num, args, objWMIService, objItem, colItems 

set args = WScript.Arguments 
num = args.Count 

if num <> 1 then 
    WScript.Echo "Usage: CScript DriveFromLabel.vbs <label>" 
    WScript.Quit 1 
end if 

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") 
Set colItems = objWMIService.ExecQuery("Select * from Win32_LogicalDisk") 

For Each objItem in colItems 
    If strcomp(objItem.VolumeName, args.Item(0), 1) = 0 Then 
    Wscript.Echo objItem.Name 
    End If 
Next 

WScript.Quit 0 

実行]を、それのように:ここで

cscript /nologo DriveFromLabel.vbs label 
+1

.batファイルから.vbsスクリプトを呼び出すことはできますか? –

1

はからドライブ文字を見つけるためにgetdrive.cmd単純なバッチスクリプトですボリュームラベル。 "getdrive MyLabel"またはgetdrive "My Label"を呼び出すだけです。

@echo off 
setlocal 

:: Initial variables 
set TMPFILE=%~dp0getdrive.tmp 
set driveletters=abcdefghijklmnopqrstuvwxyz 
set MatchLabel_res= 

for /L %%g in (2,1,25) do call :MatchLabel %%g %* 

if not "%MatchLabel_res%"=="" echo %MatchLabel_res% 

goto :END 


:: Function to match a label with a drive letter. 
:: 
:: The first parameter is an integer from 1..26 that needs to be 
:: converted in a letter. It is easier looping on a number 
:: than looping on letters. 
:: 
:: The second parameter is the volume name passed-on to the script 
:MatchLabel 

:: result already found, just do nothing 
:: (necessary because there is no break for for loops) 
if not "%MatchLabel_res%"=="" goto :eof 

:: get the proper drive letter 
call set dl=%%driveletters:~%1,1%% 

:: strip-off the " in the volume name to be able to add them again further 
set volname=%2 
set volname=%volname:"=% 

:: get the volume information on that disk 
vol %dl%: > "%TMPFILE%" 2>&1 

:: Drive/Volume does not exist, just quit 
if not "%ERRORLEVEL%"=="0" goto :eof 

set found=0 
for /F "usebackq tokens=3 delims=:" %%g in (`find /C /I "%volname%" "%TMPFILE%"`) do set found=%%g 

:: trick to stip any whitespaces 
set /A found=%found% + 0 


if not "%found%"=="0" set MatchLabel_res=%dl%: 
goto :eof 








:END 

if exist "%TMPFILE%" del "%TMPFILE%" 
endlocal 
7

これまでの回答はあまりにも複雑で、特にバッチファイルには適していないようです。

この単純なライナーは、必要なドライブ文字を変数myDriveに置きます。明らかに、「マイラベル」を実際のラベルに変更します。

for /f %%D in ('wmic volume get DriveLetter^, Label ^| find "My Label"') do set myDrive=%%D 

(バッチファイルではなく)コマンドラインから実行する場合は、%% Dを両方の場所で%Dに変更する必要があります。

変数が設定されたら、%myDrive%を使用してドライブを参照できます。たとえば、

dir %myDrive%\someFolder 
+0

これは 'cmd% 'の' %% Dは今回は予期せぬものでした'と表示します。 – Ajedi32

+1

@ Ajedi32 - あなたはもっと慎重に答えを読む必要があります。コマンドラインから直接実行する場合は、バッチスクリプト内からではなく、 '%% D 'を'%D'に変更する必要があります。 – dbenham

+0

あなたは正しいです。申し訳ありません。私は実際には、コンソールではスクリプトとは違って動作するコマンドがcmdにあると聞いて驚いています。ああ、私は次回より注意を払うべきだと思う。 – Ajedi32

関連する問題