2008-09-06 9 views
7

मैं उस ड्राइव को संदर्भित करने का प्रयास कर रहा हूं जिसका पत्र बदल सकता है। मैं इसे अपने लेबल (उदाहरण के लिए, माईलेबेल (वी :) को बैच फ़ाइल के भीतर संदर्भित करना चाहता हूं। इसे वी: \ द्वारा संदर्भित किया जा सकता है। मैं इसे माइलाबेल द्वारा संदर्भित करना चाहता हूं।केवल अपने लेबल पर आधारित ड्राइव का चयन/चयन करें? (यानी, ड्राइव अक्षर नहीं)

(यह जानकारी आप देख रहे हैं कोई जवाब नहीं के साथ एक महीने के लिए विशेषज्ञों का Echange पर तैनात थे। चलो देखते हैं कितनी तेजी से अतः यह उत्तर देता है)

उत्तर

1

इस बल्ले फ़ाइल आप एक अभियान लेबल से ड्राइव अक्षर दे देंगे:

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

आप उस के लिए WMI क्वेरी भाषा का प्रयोग कर सकते हैं। उदाहरण के लिए http://msdn.microsoft.com/en-us/library/aa394592(VS.85).aspx पर एक नजर डालें। के लिए Win32_LogicalDisk वर्ग की संपत्ति VolumeName के माध्यम से उपलब्ध जैसे है, http://msdn.microsoft.com/en-us/library/aa394173(VS.85).aspx

SELECT * FROM Win32_LogicalDisk WHERE VolumeName="MyLabel"

1

यहाँ एक सरल बैच से कोई ड्राइव अक्षर को खोजने के लिए getdrive.cmd स्क्रिप्ट है एक वॉल्यूम लेबल। बस "गेटड्राइव माईलेबेल" या गेटड्राइव "माई लेबल" पर कॉल करें।

@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 

कमांड लाइन (एक बैच फ़ाइल में नहीं) से चलाते हैं, तो %% डी दोनों स्थानों में% डी करने के लिए परिवर्तित किया जाना चाहिए।

एक बार परिवर्तनीय सेट हो जाने पर, आप %myDrive% का उपयोग कर ड्राइव का संदर्भ ले सकते हैं। उदाहरण के लिए

dir %myDrive%\someFolder 
+0

कि प्रिंट '%% डी इस समय अप्रत्याशित था।' 'Cmd' में। – Ajedi32

+1

@ अजदी 32 - आपको उत्तर को अधिक सावधानी से पढ़ने की आवश्यकता है। यदि आप कमांड लाइन से सीधे चल रहे हैं (बैच स्क्रिप्ट के भीतर से नहीं) – dbenham

+0

ओह, आप सही हैं, तो आपको '%% D' से'% D' को बदलना होगा। उसके लिए माफ़ करना। मैं यह जानकर आश्चर्यचकित हूं कि cmd में कमांड हैं जो कंसोल में अलग-अलग काम करते हैं जो वे स्क्रिप्ट में करते हैं। ओह ठीक है, अनुमान है कि मुझे अगली बार अधिक ध्यान देना चाहिए। – Ajedi32

संबंधित मुद्दे