2009-04-09 14 views
6

मैं एक विंडोज बैच कमांड फ़ाइल डीबग कर रहा हूँ। यह विफल हो रहा है जब विस्तारित (> 0x7f) वर्ण पथ या फ़ाइल नामों में उपयोग किए जाते हैं। समस्या एक कमांड फ़ाइल में गुजरने वाले पैरामीटर से संबंधित प्रतीत होती है जिसे दूसरे से कॉल किया जाता है।विंडोज आदेशों में विस्तारित वर्णों को संभालना?

एक उदाहरण के लिए, इस आदेश का काम करता है के रूप में उम्मीद:

xcopy "Pezuñero\1 - 001.wav" \temp 

यह नहीं करता है:

call another.cmd "Pezuñero" 

"another.cmd" की सामग्री:

xcopy "%~1\1 - 001.wav" \temp 

% ~ 1 वाक्यविन्यास एक पैरामीटर फैलाता है और उद्धरण हटा देता है। यह आवश्यक है क्योंकि असली कमांड फ़ाइल में, कॉलिंग या कॉल कमांड फ़ाइल में पथ रिक्त स्थान हो सकते हैं।

C:\>call another.cmd "Pezu±ero"  

C:\>xcopy "Pezu±ero\1 - 001.wav" \temp 
File not found - 1 - 001.wav 
0 File(s) copied 

ध्यान दें कि "एन" (0xF1) चरित्र एक "±" (0xB1) को बदल दिया गया है:

दूसरे उदाहरण (सीएमडी खिड़की से नकल) का परिणाम यह है।

क्या कोई यह बता सकता है कि क्या हो रहा है, और इसके आसपास कैसे काम करना है?

उत्तर

3

मैकडॉवेल और रोमुलो को सही दिशा में इंगित करने के लिए धन्यवाद। मुझे एहसास हुआ कि मुझे बैच उत्पन्न करने वाले मेरे एप्लिकेशन (डेल्फी में) को बदलने की ज़रूरत है, इसलिए यह उचित (OEM) कोड पृष्ठ का उपयोग करता है जो विंडोज में कमांड प्रोसेसर के साथ संगत है। मुझे कोडपेज स्ट्रिंग्स को कन्वर्ट करने के लिए कुछ भी नहीं मिला, लेकिन मैंने विंडोज एपीआई फ़ंक्शन SetFileApisToOEM और SetFileApisToANSI को खोजा;

कि मैंने शुरू और मेरे कार्यक्रम के अंत में इन शब्दों में कहें, इस तरह:

{main procedure} 
begin 
    SetFileApisToOEM; 
    {all the rest of the program} 
    SetFileApisToANSI; 
end. 

अब बैच फ़ाइलों OEM कोड पृष्ठ के साथ उत्पन्न कर रहे हैं, और जब एक अध्यक्ष एवं प्रबंध निदेशक शीघ्र से चला वे ठीक से काम करते हैं।

+0

आप अपनी स्क्रिप्ट पर लिखने से पहले स्ट्रिंग को कन्वर्ट करने के लिए CharToOem का भी उपयोग कर सकते हैं: http://msdn.microsoft.com/en-us/library/ms647473.aspx –

0

आपको कोडपेज को उस पर सेट करने की आवश्यकता हो सकती है जिसमें शीर्ष पर ~ n है।

+0

पॉइंटर को कोडपेज के लिए धन्यवाद। मैं उनके साथ वास्तव में परिचित नहीं था - मैंने सीखा है कि विंडोज आमतौर पर कोडपेज 1252 का उपयोग करता है, लेकिन कमांड विंडो और बैच फ़ाइलें कोड पेज 437 का उपयोग करती हैं। मैंने अपनी बैच फ़ाइल की शुरुआत में "सीएचसीपी 1252" कमांड डाला। दुर्भाग्यवश, इसने समस्या को ठीक नहीं किया। – tim11g

1

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

4

स्क्रिप्ट समान कूट cmd.exe का उपयोग करता है में लिखा होना चाहिए पर विचार नहीं मिली है।

प्रपत्र पर chcp टाइप करें और देखें कि आपको क्या मिलता है। फिर उस एन्कोडिंग का समर्थन करने वाले संपादक के साथ फ़ाइल खोलें। मेरे लिए chcp कोड कोड आउटपुट करता है, इसलिए मैं JEdit में आईबीएम 850 फ़ाइल एन्कोडिंग के रूप में अपनी स्क्रिप्ट संपादित करता हूं। प्रारूपOEM पर PSPad में फ़ाइल को संपादित करने के समान परिणाम मिलते हैं।

पुनश्च: एक ± जब कमांड प्रॉम्प्ट से पढ़ने मैं अपने मशीन में अपने चरणों का परीक्षण किया और ñ चरित्र है कि मैं notepad.exe में लिखने (डिफ़ॉल्ट एएनएसआई एन्कोडिंग का उपयोग) भी बदल जाती है, तो ऐसा लगता है कि आपकी मशीन समान एएनएसआई और OEM एन्कोडिंग का उपयोग करती है। यह सुनिश्चित करने के लिए ñ¤ (नोटपैड.एक्सई के साथ) को बदलने का प्रयास करें। कमांड प्रॉम्प्ट से चलाते समय स्क्रिप्ट मेरे लिए सही तरीके से काम करता है (क्योंकि एएनएसआई के by का बाइट मान OEM के ñ जैसा ही है)।

2

मैं looking at character handling in cmd.exe रहा हूं और मुझे लगता है कि Romulo ने सिर पर नाखून मारा है। डिफ़ॉल्ट रूप से, प्रॉम्प्ट पुराने डॉस (OEM) कोड पृष्ठों का उपयोग करता है (शायद डॉस प्रोग्राम के साथ संगतता के लिए)। आप (संभवतः) डिफ़ॉल्ट विंडोज कोड पेज (संभवतः 1252) का उपयोग करके अपनी फ़ाइल लिख रहे हैं, जो अलग है। बैच फ़ाइल को संपादित करने के लिए संपादित करें का उपयोग करें।

अगर मैं प्रॉम्प्ट पर chcp लिखते हैं, तो कोड पेज 850

तो, उदाहरण के लिए, अगर मैं नोटपैड का उपयोग इस टाइप करने के लिए रिपोर्ट:

DIR Pezuñero 

... अगर मैंका उपयोग

     ñ 
44 49 52 20 50 65 7A 75 F1 65 72 6F 

: इस द्विआधारी मूल्यों के साथ 1252 के रूप में एन्कोड किया गया हैफ़ाइल में लिखने का, यह द्विआधारी मूल्यों के साथ 850 के रूप में एन्कोड किया गया है:

     ñ 
44 49 52 20 50 65 7A 75 A4 65 72 6F 

एक बात मैं पर cmd/यू स्विच का उपयोग कर रहा है देखा नहीं है, लेकिन मैं बहुत यकीन है कि केवल है कर रहा हूँ खोल कमांड में निर्मित के लिए और XCOPY के साथ आपकी मदद नहीं करेगा।

+0

असल में, बैच फ़ाइलों को एक एप्लिकेशन द्वारा उत्पन्न किया जाता है। तो प्रश्न यह बन जाता है कि Win32 ऐप में कोड पेज अनुवाद कैसे किए गए हैं (मेरे मामले में डेल्फी 7)? क्या कोई विंडोज एपीआई है जो कोडपेज एक्स में एक स्ट्रिंग लेता है और इसे कोडपेज वाई में बदल देता है? – tim11g

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