2011-09-01 30 views
6

मैं कैसे जांच सकता हूं कि एक बैच स्क्रिप्ट से निष्पादित उपयोगकर्ता द्वारा निर्देशिका लिखने योग्य है या नहीं?यह जांचने का सबसे अच्छा तरीका है कि निर्देशिका बीएटी स्क्रिप्ट में लिखने योग्य है या नहीं?

यहाँ क्या मैं अब तक की कोशिश की है:

> cd "%PROGRAMFILES%" 

> echo. > foo 
Access is denied. 
> echo %ERRORLEVEL% 
0 

ठीक है, तो कैसे के बारे में ...

> copy NUL > foo 
Access is denied. 
> echo %ERRORLEVEL% 
0 

ऐसा नहीं है कि या तो? फिर इसके बारे में ...

> copy foo bar 
Access is denied. 
     0 file(s) copied. 
> echo %ERRORLEVEL% 
1 

यह काम करता है, लेकिन फ़ाइल मौजूद नहीं है तो यह टूट जाती है।

मैंने आंतरिक आदेशों के बारे में कुछ पढ़ा है जो ERRORLEVEL को सेट नहीं कर रहा है, लेकिन copy जाहिर है कि आखिरी मामले में ऐसा लगता है।

+1

ओह हाँ ... विंडोज़ वातावरण आपको इसके साथ पेश करेगा। कई आदेश% errorlevel% सही ढंग से वापस नहीं करते हैं ... साथ ही साथ कई स्थापित अनुप्रयोग जो कमांड लाइन तर्क का उपयोग करते हैं। = डी – Mechaflash

+1

हाहा, हाँ ... पतली कहानियों वाली बर्फ का उल्लेख न करें जो उद्धरण और रिक्त स्थान वाले पथ हैं। मैंने 8.3 पथनामों का उपयोग करने का प्रयास किया है। ;) – batshcrazy

+1

आपको एसओ बहन साइट में इस प्रश्न के साथ अधिक भाग्य मिल सकता है .. सुपरसियर।कॉम – inspite

उत्तर

3

बैच फ़ाइल को कॉपी करने के लिए आप copy %0 foo लिख सकते हैं।
यह हमेशा मौजूद रहेगा।

फ़ाइल को बाद में हटाने के लिए याद रखें, और यह सुनिश्चित करने के लिए कि आप उस नाम से मौजूदा फ़ाइल को ओवरराइट नहीं कर रहे हैं।

ऐसा करने का एक बेहतर तरीका होना चाहिए, लेकिन मुझे किसी के बारे में पता नहीं है।

EDIT: बेहतर अभी तक, mkdir foo आज़माएं।
यदि बैच फ़ाइल किसी नेटवर्क से चल रही है (या यदि यह बहुत बड़ी है), तो यह तेज़ हो सकता है।

+0

चतुर :)। मैं अभी तक अपने प्रश्न का उत्तर नहीं दे सकता, लेकिन उसने मुझे मारा, मैं 'एनयूएल फू कॉपी' भी कर सकता हूं और उसी परिणाम को प्राप्त कर सकता हूं। – batshcrazy

+0

उदाहरण के लिए, आप 'कॉपी नूल फू' के साथ एक खाली फ़ाइल भी बना सकते हैं। – Joey

+0

यह "कॉल: लेबल" का उपयोग करके ट्रिगर में काम नहीं करेगा, क्योंकि% 0 लेबल नाम होगा - इसलिए "हमेशा" नहीं। ;) –

3

निश्चित रूप से इसके खिलाफ एक आदेश चला रहा है यह पता लगाने के लिए कि क्या इसे अस्वीकार करना आसान तरीका है। आप सीएसीएलएस का उपयोग यह भी पता लगाने के लिए कर सकते हैं कि अनुमतियां क्या हैं या नहीं हैं। यहां एक नमूना है।

सीएमडी प्रकार में CACLS /?

CACLS "filename" आप दे देंगे क्या वर्तमान अनुमतियाँ फ़ाइल पर अनुमति दी है। आर = पढ़ें, डब्ल्यू = लिखें, सी = बदलें (लिखने के समान ही?), एफ = पूर्ण पहुंच।

संपादित करें: आप निर्देशिका नाम का भी उपयोग कर सकते हैं।

तो आप एक जांच करने के लिए,:

FOR /F "USEBACKQ tokens=2 delims=:" %%F IN (`CACLS "filename" ^| FIND "%username%"`) DO (
IF "%%F"=="W" (SET value=true && GOTO:NEXT) 
IF "%%F"=="F" (SET value=true && GOTO:NEXT) 
IF "%%F"=="C" (SET value=true && GOTO:NEXT) 
SET value=false 
) 
ECHO This user does not have permissions to write to file. 
GOTO:EOF 
:NEXT 
ECHO This user is able to write to file. 
+0

+1 इसे सही करने के लिए। – SLaks

+1

यह सही नहीं है, आप अपने उपयोगकर्ता (व्यवस्थापक, उपयोगकर्ता, हर किसी आदि) के लिए एक विशिष्ट एसीई के बिना किसी फ़ोल्डर तक पहुंच सकते हैं – Anders

+0

@Anders फ़ोल्डर बनाएं और फ़ोल्डर 'cacls foldername/P% computername फ़ोल्डर पर निम्न आदेश चलाएं % \% उपयोगकर्ता नाम%: R' अब इसमें सीडी करें और 'ECHO हैलो> file.txt' करें आपको एक एक्सेस अस्वीकार कर दी जाएगी। – Mechaflash

0
set testdir=%programfiles% 
set myguid={A4E30755-FE04-4ab7-BD7F-E006E37B7BF7}.tmp 
set waccess=0 
echo.> "%testdir%\%myguid%"&&(set waccess=1&del "%testdir%\%myguid%") 
echo write access=%waccess% 
1

मैंने पाया कि बैच फ़ाइल के भीतर copy को क्रियान्वित करने के लिए STDERR एक त्रुटि गूँजती है, लेकिन %ERRORLEVEL% (0 अभी भी) छोड़ दिया अछूता। इसलिए कामकाज set के सशर्त निष्पादन के साथ कमांड को गठबंधन करना था।

copy /Y NUL "%FOLDER%\.writable" > NUL 2>&1 && set WRITEOK=1 
IF DEFINED WRITEOK ( 
    rem ---- we have write access ---- 
    ... 
) else (
    rem ---- we don't ---- 
    ... 
) 

यह एक्सपी और 7 पर परीक्षण किया जाता है और विश्वसनीय रूप से काम करता है।

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

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