2015-06-26 11 views
6

मेरे .bat फ़ाइल को फिर से चलाकर इस तरह दिखता है:फ़ाइल .bat विंडोज के लिए यूनिकोड मानकों पासिंग जब यह

@echo off 

CD /D "%~dp0" 

if [%2]==[] ( 
    set user=%USERNAME% 
) else (
    set user=%2% 
) 

:getFile 
if [%1]==[] (
    set /p file=Enter file name : 
) else (
    set file=%~f1 
    echo File name: %~f1 
) 

:checkFile 
for /f "useback tokens=*" %%a in ('%file%') do set file=%%~a 

if not exist "%file%" (
    echo Error: Could not find file: %file% 
    echo. 
) 

:: Check for admin permissions 
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" 

if '%errorlevel%' == '0' (
    goto gotAdmin 
) 

:: Rerun this batch with admin rights 
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" 
echo UAC.ShellExecute "cmd", "/c """"%~f0"" ""%file%"" ""%user%""""", "%CD%", "runas", 1 >> "%temp%\getadmin.vbs" 
"%temp%\getadmin.vbs" 
exit /B 

:gotAdmin 
if exist "%temp%\getadmin.vbs" (del "%temp%\getadmin.vbs") 
pushd "%CD%" 
CD /D "%~dp0" 

echo. 

:eof 
pause 
exit /B 

मैं इन दो परीक्षण फ़ाइलें:

  1. C: \ टेस्ट \ फ़ोल्डर \ フ ァ イ ル.txt
  2. C: \ टेस्ट \ フ ォ ル ダ \ file.txt

जब मैं ऊपर बैच फ़ाइल और खींचें 1 cmd खिड़की मैं पर चलाएँ:

enter image description here

है, जो अच्छा है।

जब मैं 2 के लिए भी ऐसा ही है, मैं मिलता है:

enter image description here

जब मैं UAC.ShellExecute फोन,% फ़ाइल% सही ढंग से नहीं पहुंचेगी।

मैं इस समस्या को कैसे हल कर सकता हूं?

+0

'सेट उपयोगकर्ता =% 2%' 'सेट किया जाना चाहिए उपयोगकर्ता =% 2' के बिना पर प्रतिशत चिह्न:

तो यहाँ कैसे आप VBS फ़ाइल लिख सकते हैं और इसे चलाने है समाप्त। – Mofi

उत्तर

2

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

पहले राइट-क्लिक करें foo.bat, फिर शॉर्टकट बनाएं। उस शॉर्टकट के लिए गुणों को खोलें, उन्नत ... बटन पर क्लिक करें और सक्षम करें व्यवस्थापक के रूप में चलाएं।

इसका नकारात्मक पक्ष है: आप परिणामी कमांड प्रॉम्प्ट विंडो पर फ़ाइल नाम खींच नहीं सकते हैं। लेकिन आप शॉर्टकट पर एक फ़ाइल खींच सकते हैं।

लेकिन अगर मैं नहीं चाहता या शॉर्टकट का उपयोग नहीं कर सकता तो क्या होगा?

आप अपनी फ़ाइल नाम को अपनी स्क्रिप्ट के तर्क के रूप में पास करके फ़ाइल में मनमाने ढंग से यूनिकोड वर्ण लिखने की आवश्यकता से बच सकते हैं। भले ही वीबीएस फ़ाइल एएनएसआई एन्कोडिंग में है, स्क्रिप्ट होस्ट हमेशा आंतरिक रूप से यूनिकोड का उपयोग करता है। बैच कोड की पंक्ति 8 में

:: Rerun this batch with admin rights 
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" 
echo UAC.ShellExecute "cmd", "/c """"%~f0"" """ + Wscript.Arguments.Item(0) + """ ""%user%""""", "%CD%", "runas", 1 >> "%temp%\getadmin.vbs" 
"%temp%\getadmin.vbs" "%file%" 
exit /B 
+0

@ स्कॉट ग्रिफिथ्स: ऐसा लगता है कि जेपेन यहां चुप हो गया है। क्या आप इस उत्तर में कुछ और देखना चाहते हैं? –

+0

@ पीटरब्रिटन: मैंने सिर्फ जेपेन को उकसाया है और वह एक स्वीकार करने से पहले इस नए जवाब को देख रहा है। मुझे लगता है कि हमारे पास समाधान समाधान हैं इसलिए बक्षीस सबसे सरल हो जाएगा। –

+0

@ स्कॉट ग्रिफिथ्स: समझ में आता है। –

1

एक CHCP (बदलें कोड पृष्ठ) आदेश, जैसे जोड़कर आप की बैच फ़ाइल शुरू करने के लिए UTF-8 कोड पेज 65001 का उपयोग करके देखें:

@echo off 

chcp 65001 
. 
. 
. 

यहाँ कोड पेज पहचानकर्ता पर थोड़ा अधिक जानकारी के लिए देखें : https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx

संपादित करें: आप MUST भी अपने कमांड विंडो के लिए इस तरह के ल्युसिडा कंसोल के रूप में एक यूनिकोड सक्षम फ़ॉन्ट का उपयोग। इसके बिना कमांड प्रोसेसर यूनिकोड वर्णों पर चोक करता है, और या तो फाइल नहीं मिलेगा, या "सिस्टम निर्दिष्ट डिवाइस पर लिख नहीं सकता" त्रुटि प्रदर्शित कर सकता है।

कमांड विंडो के ऊपरी-बाईं ओर स्थित विंडो आइकन पर क्लिक करें, मेनू पर डिफ़ॉल्ट चुनें, फिर फ़ॉन्ट टैब पर लुसीडा कंसोल चुनें।

अद्यतन - टेस्ट बैच फ़ाइल और नीचे आउटपुट। ,

@echo off 

chcp 65001 

CD /D "%~dp0" 


:getFile 
if [%1]==[] (
    set /p file=Enter file name : 
) else (
    set file=%~f1 
    echo File name: %~f1 
) 

:checkFile 
for /f "useback tokens=*" %%a in ('%file%') do set file=%%~a 

if not exist "%file%" (
    echo Error: Could not find file: %file% 
    echo. 
) else (
    echo Found file "%file%" 
) 

यहाँ अपने परीक्षण से उत्पादन होता है जब मैं सबसे पहले खींचें:

यहाँ बैच फ़ाइल मैं परीक्षण करने के लिए इस का उपयोग कर रहा है "C: \ अस्थायी \ परीक्षण \ フ ァ イ ル .txt" में विंडो, फिर दूसरी बार "सी: \ temp \ test \ フ ォ ル ダ \ file2.txt"।

मेरा सिस्टम अंग्रेजी यूके सेटिंग्स के साथ विन 7 प्रो x64 एसपी 1 है।

Sample output

+0

@ बियर शराब - मैंने पहले ही यह कोशिश की है लेकिन दुर्भाग्य से यह समस्या को ठीक नहीं करता है। आउटपुट संदेश में परिवर्तन होता है "त्रुटि: फ़ाइल नहीं मिल सका: सी: \ टेस्ट \ ム• ã, © ル ム€ \ File.txt " – jpen

+0

कृपया मेरा अद्यतन उत्तर देखें - मैं वैकल्पिक रूप से वैकल्पिक होने के बारे में गलत था - आप काम करने के लिए इसके लिए एक यूनिकोड फ़ॉन्ट का उपयोग करना चाहिए! मैंने आपकी बैच फ़ाइल के सबसेट के साथ परीक्षण किया है, और एक ही नाम के साथ एक परीक्षण फ़ाइल और फ़ोल्डर बना रहा है, और जब फ़ॉन्ट लुसीडा कंसोल पर सेट की जाती है तो स्क्रिप्ट महान काम करता है ** ** – beercohol

+0

@ बियर शराब-हम्म अजीब .. मैं लुसीडा कंसोल का उपयोग कर रहा हूं लेकिन समस्या अभी भी बनी हुई है। – jpen

1

आपकी समस्या जिस तरह से आप अपने अस्थायी VBS फ़ाइल बनाने का मतलब है कि यह एक वैध यूनिकोड फ़ाइल नहीं है और इसलिए विंडोज कैसे यूनिकोड नाम आप में पारित किया है व्याख्या करने के लिए पता नहीं है।

कोड पेज 65001 का उपयोग करने के लिए बियर शराब की सलाह के बाद, मुझे अभी भी पता चला है कि मैं एक यूनिकोड निर्देशिका में फ़ाइल तक नहीं पहुंच सका। हालांकि, अगर मैंने एक यूनिकोड संपादक (उदा।नोटपैड का उपयोग करके और एक यूनिकोड एन्कोडिंग के रूप में सहेजना) और स्वत: जेनरेटेड वीबीएस फ़ाइल की बजाय मैन्युअल स्क्रिप्ट का आह्वान करें, यह सब अभी काम किया है।

मैंने इसके बजाय एक यूआरएफ -16 फाइल बनाने के लिए iconv का उपयोग करने के लिए अपनी स्क्रिप्ट फिर से काम की है। ध्यान दें कि काम करने के लिए इस स्क्रिप्ट को कोड पेज 65001 के साथ चलाने की आवश्यकता है।

@echo off 

CD /D "%~dp0" 

if [%2]==[] ( 
    set user=%USERNAME% 
) else (
    set user=%2 
) 

:getFile 
if [%1]==[] (
    set /p file=Enter file name : 
) else (
    set file=%~f1 
    echo File name: %~f1 
) 

:checkFile 
for /f "useback tokens=*" %%a in ('%file%') do set file=%%~a 

if not exist "%file%" (
    echo Error: Could not find file: %file% 
    echo. 
) 

:: Check for admin permissions 
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" 

if '%errorlevel%' == '0' (
    goto gotAdmin 
) 

:: Rerun this batch with admin rights 
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" 
echo UAC.ShellExecute "cmd", "/c """"%~f0"" ""%file%"" ""%user%""""", "%CD%", "runas", 1 >> "%temp%\getadmin.vbs" 
iconv.exe -f utf-8 -t utf-16le "%temp%\getadmin.vbs" > "%temp%\getadmin2.vbs" 
"%temp%\getadmin2.vbs" 
exit /B 

:gotAdmin 
if exist "%temp%\getadmin.vbs" (del "%temp%\getadmin.vbs") 
if exist "%temp%\getadmin2.vbs" (del "%temp%\getadmin2.vbs") 
pushd "%CD%" 
CD /D "%~dp0" 

echo. 

:eof 
pause 
exit /B 
संबंधित मुद्दे