पॉवर्सशेल में जर्मन उमलैट्स को वीबीएस द्वारा बुलाया गया

Dec 15 2020

मेरे पास एक ps1 फ़ाइल है, जो एक लिंक बनाती है

create-link.ps1

$path = $env:HOMESHARE + "\My Projects\"
If(!(test-path $path)) { New-Item -ItemType Directory -Force -Path $path
}

$WshShell = New-Object -comObject WScript.Shell $Shortcut = $WshShell.CreateShortcut($env:HOMESHARE + "\My Projects\" + "linkname.lnk")
$Shortcut.TargetPath = "\\path\for\link" $Shortcut.Description = "äöüß"
$Shortcut.IconLocation = $env:SYSTEMROOT + "\\system32\\shell32.dll,3"
$Shortcut.Save()

मेरे पास एक vbs फ़ाइल भी है जिसे ps1 कहते हैं

create-link.vbs

command = "powershell.exe Get-Content ""C:\path\to\file\create-link.ps1"" | PowerShell.exe -noprofile"
set shell = CreateObject("WScript.Shell")
shell.Run command,0

दोनों फ़ाइलों को utf-8 एन्कोडिंग के साथ सहेजा जाता है।

यह निर्माण आवश्यक था, क्योंकि पीएस 1 को उपयोगकर्ता के लिए किसी भी ध्यान देने योग्य चीजों के बिना पूरी तरह से बिना सिर के चलने की आवश्यकता थी। एक vbs के माध्यम से ps1 को कॉल करने से यह समस्या हल हो गई, अगर कोई बेहतर तरीका है तो मुझे खुशी होगी अगर आप मुझे बताएंगे।

अगर मैं सीधे पॉवरशेल स्क्रिप्ट को कॉल कर रहा हूं या "पावरशेल। गेट-कंटेंट" "C: \ path \ to \ file \ create-link.ps1" "| PowerShell.exe -noprofile" (cmd का उपयोग करके) सब कुछ ठीक काम करता है । हालाँकि, अगर मैं सामान्य रूप से काम करने के लिए vbs को कॉल करता हूं, लेकिन 'विवरण' से जर्मन umlauts सिर्फ प्रश्न चिह्न हैं, तो किसी तरह एन्कोडिंग में खराबी आ गई। क्या इसको ठीक करने का कोई तरीका है?

जवाब

2 mklement0 Dec 15 2020 at 20:59

tl; डॉआर:

  • अपनी *.ps1फ़ाइल को BOM के साथ UTF-8 के रूप में सहेजें ।

  • PowerShell CLI के -Fileपैरामीटर का उपयोग करके अपनी कमांड को सरल बनाएं :

command = "powershell.exe -NoProfile -File ""C:\path\to\file\create-link.ps1"""

यह भी देखें: GitHub मुद्दा # 3028 , जो पावरशेल को पूरी तरह से खुद को छुपाने की क्षमता का अनुरोध करता है - एक ऑक्स की आवश्यकता को पूरा करते हुए। VBScript स्क्रिप्ट - जिसका भविष्य का संस्करण समर्थन कर सकता है (लेकिन यह Windows PowerShell पर वापस पोर्ट नहीं होगा)।


यदि आप Windows PowerShell (v5.1 तक के संस्करण) का उपयोग कर रहे हैं , तो आपको अपनी *.ps1फ़ाइलों को UTF-8 के रूप में BOM के साथ सहेजना होगा, ताकि ASCII (7-बिट) श्रेणी के बाहर के वर्णों के संबंध में उनकी सही व्याख्या की जा सके, जैसे कि äöüß
यह अब PowerShell [Core] v6 + में आवश्यक नहीं है , जो लगातार UTF-8 में चूक करता है, लेकिन यदि आपकी स्क्रिप्ट को दोनों संस्करणों में चलाने की आवश्यकता है , तो आपको हमेशा BOM के साथ UTF-8 का उपयोग करना चाहिए ।

अगर किसी के *.ps1पास BOM नहीं है, तो Windows PowerShell प्रत्येक बाइट की व्याख्या करता है जो UTF-8 एन्कोडिंग अनुक्रम का हिस्सा है (सभी गैर-ASCII वर्ण 2-4 बाइट्स के रूप में एन्कोडेड हैं) व्यक्तिगत रूप से सिस्टम के सक्रिय ANSI पर आधारित है। कोड पृष्ठ (एकल-बाइट एन्कोडिंग जैसे कि Windows-1252)।

यूएस-इंग्लिश सिस्टम पर, जहां सक्रिय ANSI कोड पेज Windows-1252 है, उपरोक्त नमूना स्ट्रिंग इसलिए गार्निश स्ट्रिंग के रूप में सतहों äöüß

ध्यान दें कि प्रश्नवाचक चिन्ह, या, अधिक सटीक रूप से, ( उदाहरण के लिए, उदाहरण के लिए , U+FFFD) केवल रिवर्स परिदृश्य में सतह होगा : जब ANSI- एन्कोडेड पाठ को UTF-8 के रूप में गलत समझा जाता है।


एक तरफ के रूप में, पाइपलाइन (स्टड) के माध्यम से पावरशेल सीएलआई को स्रोत कोड प्रदान करने के अपने दृष्टिकोण को फिर से करें :

चूंकि आपकी स्क्रिप्ट स्पष्ट रूप से छिपी हुई है, इसलिए यह आपके मामले में कोई अंतर नहीं लाएगा, लेकिन ध्यान दें कि यह तकनीक छद्म संवादात्मक मोड को प्रदर्शित करती है और स्टड के माध्यम से प्रदान की जा रही स्क्रिप्ट को तर्क देने का समर्थन नहीं करती है - देखें GitHub मुद्दा # 3223