पुनर्निर्देशित जीत कंसोल कमांड आउटपुट के एन्कोडिंग को नियंत्रित करना


3

यहाँ मैं क्या करना चाहता हूँ:

कंसोल एप्लिकेशन के आउटपुट को ठीक से रीडायरेक्ट करना (मैं संदेश में बाकी कमांड शब्द का उपयोग करता हूं ) 1252 एन्कोडिंग के साथ एक फाइल में (डिफ़ॉल्ट कॉन्फ़िगरेशन में किसी भी नोटपैड सॉफ्ट से पठनीय बनाने के लिए।

मैंने क्या देखा है:

Chcp आंतरिक कमांड और कुछ बाहरी कमांड (हाल ही में) के साथ प्रभावी है

सबसे पहले यह ध्यान देने योग्य है कि CHCP Win7 और Win 10 के तहत अलग-अलग काम करता है।

यदि निम्न बैच को cmd प्रॉम्प्ट से चलाया जाता है, तो आप नोटिस कर सकते हैं कि कमांड आउटपुट को win10 कंसोल में ठीक से प्रदर्शित किया गया है जबकि एक win7 कंसोल ASCII के पात्रों को बुरी तरह से प्रस्तुत करता है।

for /f "tokens=2 delims=:" %%G in ('chcp') do Set _cp_=%%G
chcp 1252
@echo test an internal command
dir
@echo test an external (recent) command: Robocopy
robocopy .\ .\ /L
@echo test an external (legacy) command: Xcopy
xcopy test.txt 2>&1
chcp %_cp_%
echo end of test.cmd batch 

संयोग से, मुझे यह जानने में दिलचस्पी है कि इस तरह के अंतर का कारण क्या है, हालांकि यह वास्तव में उस संदेश का उद्देश्य नहीं है और चूंकि यह आसानी से एक पीके इनवॉइस "पॉइशशेल [कंसोल] :: outputencoding = [system.text.encoding] :: को जोड़ने के लिए ठीक करने योग्य है :: (850) "बैच में 1 chcp कमांड के बाद।

जब भी बैच आउटपुट को किसी फ़ाइल में पुनर्निर्देशित किया जाता है, तो वास्तविक समस्या होती है: test.cmd> test.txt।

उस स्थिति में परिणाम वही है जो कुछ भी ओएस। आंतरिक कमांड और नए बाहरी कमांड (रोबोकॉपी, बीसीडिट, आदि) का आउटपुट ठीक से 1252 एनकोडेड है। लिगेसी कमांड (xcopy, chcp, आदि) (OEM कोड पेज में आउटपुट) नहीं हैं। संक्षेप में, अधिकांश कमांड सीएचसीपी या समतुल्य [कंसोल] परिवर्तन के कारण प्रभावित नहीं होते हैं।

उस गड़बड़ के बारे में विभिन्न अटकलें:

  1. विरासत कमांड कोड CRT पर आधारित है जबकि आंतरिक कमांड और सबसे हाल के बाहरी लोग Win32 API का उपयोग करते हैं। यह MSDN ग्लोबलाइजेशन चरण-दर-चरण से कंसोल एप्लिकेशन डेवलपमेंट के बारे में अंतिम खंड पर आधारित है !

  2. कम से कम win10 में कंसोल में क्या प्रदर्शित किया गया है (सभी कमांड आउटपुट के लिए एक ही एन्कोडिंग) और संग्रहीत एक फ़ाइल अलग है (आउटपुट एन्कोडिंग कमांड के आधार पर परिवर्तन), आउटपुट / इनपुट स्ट्रीम को उनके द्वारा इंगित किए गए हैंडल के प्रकार के आधार पर अलग-अलग तरीके से संभाला जा सकता है। कंसोल फ़ंक्शंस का उपयोग प्रदर्शन के लिए किया जा सकता है और रीडायरेक्शन के मामले में I / O फ़ाइल फ़ंक्शंस। उच्च-स्तरीय कंसोल इनपुट और आउटपुट फ़ंक्शंस पर आधारित अटकलें !

  3. MS कंसोल एप्लिकेशन के कोड की सिफारिश करता है जो आउटपुट स्ट्रीम के OEM एन्कोडिंग को मजबूर करता है। संदर्भ। कंसोल अनुप्रयोग समस्याएँ यदि MS सुझाव बाहरी आदेशों के कोड में लागू किया जाता है जो यह समझा सकता है कि किसी फ़ाइल में उनके आउटपुट स्ट्रीम का पुनर्निर्देशन हमेशा कंसोल कोड पृष्ठ पर लागू होने वाले OEM_CP को एन्कोड किया जाता है। विचित्र रूप से, Readfile और writefile का उल्लेख SetFileApisToOEM से प्रभावित कार्यों के बीच नहीं किया गया है

अंत में मुझे नहीं पता कि विरासत की आज्ञाओं और हाल ही में शुरू किए गए लोगों के बीच का अंतर इसलिए है क्योंकि उनका कोड एमएस सुझाव का सम्मान करता है और सिर्फ इसलिए कि स्ट्रिंग शाब्दिक कोड को OEM बनाम ANSI के रूप में कोडित किया गया है।

संभव समाधान / समाधान

यदि 3 सही है, तो वे निश्चित रूप से बहुत कम हैं। रजिस्ट्री कुंजी HKLM \ system \ currentset \ control \ NLS \ codepage OEMCP = 1252 का मान बदलना संभव है। यह सुरक्षित नहीं है (यूनिकोड 65001 सेट करने की कोशिश न करें, आपका सिस्टम बूटिंग से इनकार कर सकता है) और असुविधाजनक (रिबूट आवश्यक)। या, केवल OEM एन्कोडेड सामग्री के साथ फ़ाइल को भरना और बैच के अंत में PS स्क्रिप्ट के साथ फ़ाइल को ट्रांसकोड करना। यदि फ़ाइल को समय-समय पर एक्सेस करना हो और चेक करना हो तो सिंपल लेकिन बहुत सुरुचिपूर्ण नहीं है।

यदि 2 सही है, तो एक फ़ंक्शन मौजूद हो सकता है जो I / O फ़ाइल फ़ंक्शन के एन्कोडिंग को रीडफाइल और राइटफाइल को नियंत्रित करता है

यदि 1 सही है, तो वर्तमान उपयोगकर्ता सत्र की अंतर्राष्ट्रीय सेटिंग्स या संस्कृति को नियंत्रित करना संभव है और इसलिए CRT एप्लिकेशन के कोड पृष्ठ को नियंत्रित करना चाहिए। Win8 के बाद से, यह संभव है कि Windows में Powershell Configure International Settings कॉन्फ़िगर करें । कमांड लाइन एप्लिकेशन भी इस तरह की चीजें करने में सक्षम हैं । जो भी हो, यहां कठिनाई एक "संस्कृति" बनाने के बारे में है जो कि 1252 के ओईएम कोड पेज के साथ सेट है क्योंकि यह पूर्व-निर्धारित सेट में मौजूद नहीं है

यहां तक ​​कि अगर उस मुद्दे के बारे में कोई प्रभावी समाधान नहीं है, तो भी उस विषय के अपने ज्ञान को साझा करने में संकोच न करें। मैं यह समझने के लिए उत्सुक हूं कि एमएस ने उस सामान को कैसे लागू किया है।


क्या है bashइस सवाल के साथ क्या करना है? कृपया टैग हटा दें जब तक आप समझा नहीं सकते।
DavidPostill

यहां विंडोज 7 पर आपकी टेस्ट स्क्रिप्ट कुछ अजीब नहीं दिखती है।
DavidPostill

वास्तव में कुछ भी नहीं करने के लिए बैश टैग के लिए क्षमा करें। टैग मुझे सुझाया गया और मैंने बैच पढ़ा। मेरे Win7 पर स्थानीय रूप से फ्रि-फ्रि, अगर मैं टेस्ट स्क्रिप्ट चलाता हूं, तो सभी गैर एससीआई चार बुरी तरह से प्रस्तुत किए जाते हैं: यहां पहले आदेशों का परिणाम है:> chcp 1252 पेज डी कोड सक्रिय á : 1252 एक आंतरिक कमांड का परीक्षण करें> dir Lei dans le lecteur सी एस Æ appelle सिस्टम Le संख्या U के ro डी एस U के री डु मात्रा स्था xxx
user3528651

आह। तब आपकी मदद नहीं कर सकता। ); मैं कोई अजीब अक्षर के साथ विंडोज के एक अंग्रेजी संस्करण है
DavidPostill

: कोई बात नहीं, लेकिन हां, मैं उस सभी चीजों का उल्लेख करना भूल गया, जो केवल एन-यूएस (या समान) लोकेल से बाहर सिस्टम के लिए समझ में आता है और अपनी स्थानीय भाषा में ASCII वर्णों के विभिन्न
प्रकारों
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.