2010-09-15 20 views
13

में ड्राइव अक्षर हार्डकोड किए बिना नेटवर्क ड्राइव मैप करना मुझे बैच फ़ाइल के साथ एक नेटवर्क ड्राइव मैप करने की आवश्यकता है, लेकिन ड्राइव अक्षर निर्दिष्ट नहीं करना चाहते हैं।बैच फ़ाइल

बैच फ़ाइल को तैनाती प्रक्रिया के हिस्से के रूप में उपयोग किया जाता है; मैं CruiseControl.Net से बैच फ़ाइल को कॉल करता हूं, बैच फ़ाइल को यूएनसी पथ को मैप करने की आवश्यकता होती है जिसके लिए प्रमाणीकरण के लिए प्रमाण-पत्र की आवश्यकता होती है। फिर बैच फ़ाइल RoboCopy को आउटपुट निर्देशिका से गंतव्य तक वेबसाइट पर तैनात करने के लिए कॉल करती है (और कुछ फ़ाइलों और फ़ोल्डर्स को छोड़कर)। अंत में बैच नेटवर्क ड्राइव हटा देता है।

समस्या यह है कि यह स्केलेबल नहीं है, यह ठीक है जब केवल कुछ परियोजनाएं हैं लेकिन अब हमें इस दृष्टिकोण का उपयोग करके 20 परियोजनाएं मिली हैं और मानचित्र के लिए ड्राइव अक्षरों से बाहर चल रही हैं। मैं ड्राइव अक्षरों का पुन: उपयोग नहीं करना चाहता क्योंकि वे टकरा सकते हैं - जो खराब होगा।

इस बैच फ़ाइल का एक उदाहरण है:

@echo off 
net use x: \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd 
robocopy.exe "W:\wwwroot\MyProject" x:\ *.* /E /XO /XD "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP 
net use x: /delete 

और पठनीयता के लिए स्वरूपित:

@echo off 
net use x: \\192.168.0.1\Share\wwwroot\MyProject 
    /user:mydomain\myuser MyP455w0rd 
robocopy.exe "W:\wwwroot\MyProject" x:\ *.* /E /XO /XD 
    "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP 
net use x: /delete 

उत्तर

28

आप एक से अधिक नेटवर्क शेयर simultaniously कनेक्ट नहीं है, तो आप net use * एक आवंटित कर सकते हैं आपके लिए मुफ्त ड्राइव पत्र। इसके बाद आप अपने यूएनसी पथ के माध्यम से शेयर तक पहुंचने के लिए robocopy का उपयोग कर सकते हैं और net use * /delete के साथ कोई भी कनेक्टेड शेयर जारी कर सकते हैं।

कुछ इस तरह:

@echo off 
net use * \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd 
robocopy.exe "W:\wwwroot\MyProject" "\\192.168.0.1\Share\wwwroot\MyProject" *.* /E /XO /XD "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP 
net use * /delete /yes 

संपादित करें:

जैसा कि मैंने कुछ शोध से पता चला, तो आप बस एक ड्राइव अक्षर बताए शेयर मैप कर सकते हैं। इसके बाद इसे अज्ञात रूप से मैप किया जाता है, केवल अपने दूरस्थ यूएनसी पथ से। इस तरह आप केवल अपने रिमोट नाम को निर्दिष्ट करके मैपिंग को भी हटा सकते हैं।

यह काम करना चाहिए:

@echo off 
net use \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd 
robocopy.exe "W:\wwwroot\MyProject" "\\192.168.0.1\Share\wwwroot\MyProject" *.* /E /XO /XD "App_Data/Search" "*.svn" /XF "sitefinity.log" "Thumbs.db" /NDL /NC /NP 
net use \\192.168.0.1\Share\wwwroot\MyProject /delete 
+0

वहाँ एक साथ जुड़े कई नेटवर्क शेयरों का एक मौका है, अन्यथा मैं हमेशा ज़ेड असाइन कर सकता हूं: या प्रति परियोजना हार्डकोडेड पत्र। शुद्ध उपयोग */हटाएं सभी जुड़े हुए शेयर भी जारी करेंगे और यह सर्वर –

+0

@ सिमॉन मार्टिन पर एक समस्या होगी: मेरा अद्यतन उत्तर देखें। –

+0

जो मेरे समाधान से बहुत अच्छा है :) –

2

ठीक है ... इस glamourous नहीं हो सकता है, लेकिन यह कैसे मैं अब इस कर रहा हूँ है, एक बुनियादी प्रयास पकड़ दृष्टिकोण। ड्राइव को मैप करने का प्रयास करें और यदि यह उपयोग में है तो अगला कदम प्राप्त करें। मैंने इसे केवल 2 प्रयासों के साथ सचित्र किया है, लेकिन इसे 4, 10 या अधिक ड्राइव अक्षरों तक विस्तारित करना मुश्किल नहीं है।

हां यह मेरी प्रोग्रामिंग संवेदनशीलताओं को अपमानित करता है, मुझे कोड की पुनरावृत्ति पसंद नहीं है। दुर्भाग्यवश मुझे नहीं पता कि मैं बैच फ़ाइल में पथ और प्रमाण-पत्र कैसे पारित कर सकता हूं क्योंकि मैं इसे स्वयं नहीं कहता हूं, CruiseControl.net इसे पैरामीटर के बिना कॉल करता है।

@echo off 

:START 
net use z: \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd 
if %ERRORLEVEL% ==2 goto Y 
ROBOCOPY HERE 
net use z: /delete 
exit 

:Y 
net use y: \\192.168.0.1\Share\wwwroot\MyProject /user:mydomain\myuser MyP455w0rd 
if %ERRORLEVEL% ==2 goto W 
ROBOCOPY HERE 
net use y: /delete 
exit 

:W 
sleep 20 
goto START 
10

मैं इस नेट एक नि: शुल्क ड्राइव अक्षर लेने, तो नेट का उपयोग क्या पत्र यह सौंपा पता लगाने के लिए जाने के लिए उपयोग करें:

net use * \\server\share 
for /f "tokens=2" %%i in ('net use ^| find "\\server\share"') do set netdrive=%%i 
echo %netdrive% has been mapped 
5

कुछ निम्नलिखित बैच फ़ाइल उपयोगी मिल सकता है।

यह बाहरी कार्यक्रमों पर भरोसा नहीं करता है।

बैच फ़ाइल में एक फ़ंक्शन :freedrive है, जो एक मुफ्त ड्राइव अक्षर पाता है और इसे एक चर में देता है। यह ऑप्टिकल ड्राइव का सही ढंग से पता लगाता है जिसमें ड्राइव मीडिया पर कब्जा करने के लिए कोई मीडिया नहीं है।

@echo off 
setlocal 

call :freedrive mydriveletter && goto :cont 
echo ERROR: No free drive letter found. 
goto :exit 
:cont 
echo Found drive letter: %mydriveletter% 

goto :exit 

rem Finds a free drive letter. 
rem 
rem Parameters: 
rem  %1 = Output variable name. 
rem 
rem Example: 
rem  call :freedrive mydriveletter && goto :cont 
rem  echo ERROR: No free drive letter found. 
rem  goto :EOF 
rem  :cont 
rem  echo Found drive letter: %mydriveletter% 
:freedrive 
setlocal EnableDelayedExpansion 
set exitcode=0 
set "output_var=%~1" 
for %%i in (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) do (
    set "drive=%%i:" 
    rem If 'subst' fails, the drive letter is already in use. 
    rem This way we can even detect optical drives that have a drive 
    rem letter but no media in them, a case that goes undetected when 
    rem using 'if exist'. 
    subst !drive! %SystemDrive%\ >nul 
    if !errorlevel! == 0 (
     subst !drive! /d >nul 
     goto :freedrive0 
    ) 
) 
set exitcode=1 
set drive= 
:freedrive0 
endlocal & set "%output_var%=%drive%" & exit /b %exitcode% 

:exit 
pause 
+0

मुझे यह दृष्टिकोण पसंद है; नहीं "यह देखने के लिए जांचें कि क्या उपलब्ध है और इसका उपयोग करें" बल्कि "इसका उपयोग करें और देखें कि यह काम करता है"। – Ben

0

सरलतम विधि:

pushd "\\server\share\wwwroot\My Project" 
robocopy . x:\ *.* /E ...etc 
popd 

Pushd स्वचालित रूप से एक उपलब्ध पत्र के लिए एक नेटवर्क ड्राइव को मैप करेंगे, और popd निकाल देंगे। वे आंतरिक सीएमडी आदेश हैं; यूएनसी पथों का उपयोग एक्सटेंशन को सक्षम करने की आवश्यकता है। बैच उदाहरण:

@echo off 
pushd %1 
    echo. --- Processing %1 as "%cd%" 
    echo. ... 
    rem do thing here 
    echo. Done. 
popd 

नोट: कमांड लाइन तर्क का उपयोग करके इस कार्यान्वयन में, कमांड लाइन पर पथ उद्धृत किया जाना चाहिए।

नमूना सत्र:

for /f "tokens=2" %%i in ('net use * \\server\share') do (
    if defined netdrive goto :cont 
    set netdrive=%%i 
) 

:cont 
echo.%netdrive% has been mapped 
pause 

net use %netdrive% /d /y 
pause 

यह दूसरा कॉल खोज के माध्यम से पहुंचाया शुद्ध करने के लिए बचा जाता है:

E:\temp>.\demo-pushd.bat "\\server\share\wwwroot\My Project" 
--- Processing "\\server\share\wwwroot\My Project" as "X:\wwwroot\My Project" 
    ... 
    Done. 

E:\temp> net use X: 
The network connection could not be found. 

More help is available by typing NET HELPMSG 2250. 
E:\temp> 
+0

ओपी द्वारा आवश्यक प्रमाण-पत्र परिभाषित करने का कोई तरीका नहीं है। –

+0

@ थॉमस: आज यहां 6 उत्तरों में से केवल 2 क्रेडेंशियल्स का उपयोग करते हैं, फिर भी यह एकमात्र उत्तर है जो एक डाउनवोट की योग्यता है? फॉर लूप के बजाए पुशड का उपयोग यह समस्या के हिस्से के लिए बहुत अधिक प्रत्यक्ष और सरल है। –

+1

अन्य उत्तरों 'net' कमांड का उपयोग करते हैं। हालांकि वे प्रमाण-पत्रों का उपयोग कैसे नहीं करते हैं, यह कम से कम संभव है। –

0

@longneck, मैं कुछ इस तरह का उपयोग करें।

आप इस पर भी विस्तार कर सकते हैं ताकि सेट नेटड्राइव को सीधे कॉल करने के बजाय, आप इसे सबराउटिन में करते हैं। यह आपको अधिक त्रुटि जांच या प्रसंस्करण करने की अनुमति देता है।

for /f "tokens=2" %%i in ('net use * \\server\share') do (
    if defined netdrive goto :cont 
    call :parse %%i 
) 

:parse 
if ~%1==%1~ goto :eof 
if Z:==%1 (
    set netdrive=%1 
) 
goto :eof 

:cont 
echo.%netdrive% has been mapped 
pause 

net use %netdrive% /d /y 
pause 

पार्स सबराउटिन यहां बहुत उपयोगी नहीं है और केवल अवधारणा को दर्शाता है।

1

सम्भावित समाधान यूएनसी रास्ता है कि यकीन है कि के लिए मौजूद करने के लिए pushd command लागू करने के लिए है, इसलिए एक अस्थायी ड्राइव अक्षर है कि बात यह है कि पथ के लिए बनाया जाता है। वर्तमान निर्देशिका, अर्थात् अस्थायी ड्राइव की जड़, ड्राइव अक्षर प्राप्त करने के लिए निर्धारित किया जा सकता है। अंत में, popd आदेश अस्थायी ड्राइव अक्षर को हटाने के लिए इस्तेमाल किया जाना चाहिए:

pushd "\\%COMPUTERNAME%\ADMIN$" 
rem /* Do stuff here with the root of the temporarily created drive 
rem used as the current working directory... */ 
rem // Store the current drive in variable `DRIVE` for later use: 
for /F "delims=:" %%D in ("%CD%") do set "DRIVE=%%D:" 
popd 
echo The next free drive letter is `%DRIVE%`. 

चर COMPUTERNAME और शेयर \\%COMPUTERNAME%\ADMIN$ सभी आधुनिक (NT-आधारित) विंडोज सिस्टम पर मौजूद होना चाहिए।


आप वर्तमान वातावरण pushd का प्रयास एक नि: शुल्क ड्राइव अक्षर प्राप्त करने के लिए से भी अस्थायी रूप से "प्रदूषित" बनने के लिए नहीं करना चाहते हैं, तो आपको निम्न दृष्टिकोण का उपयोग कर सकते हैं:

for /F "delims=:" %%D in (' 
    pushd "\\%COMPUTERNAME%\ADMIN$" ^&^
     for %%Z in ^(.^) do popd 
') do set "DRIVE=%%D:" 
echo The next free drive letter is `%DRIVE%`.