.NET

2012-05-30 3 views
16

में कच्चे (unsplit) कमांड लाइन प्राप्त करना .NET में, हम आसानी से Main(string[]) या Environment.GetCommandLineArgs() के तर्क से स्ट्रिंग सरणी में विभाजित कमांड लाइन तर्कों तक पहुंच सकते हैं। हालांकि, क्या एक स्ट्रिंग के रूप में अनारक्षित कमांड लाइन प्राप्त करने का कोई तरीका है?.NET

पृष्ठभूमि: मेरा ऐप स्वयं को FileExplorer संदर्भ मेनू (जैसे नोटपैड ++ करता है) में जोड़ रहा है। जब इसे इस तरह से लॉन्च किया जाता है, तो फ़ाइल नाम उद्धरण के बिना पारित किया जाता है, जिसका अर्थ है कि पथ में रिक्त स्थान हैं, तो यह टूट गया है। मुझे पता है कि myapp.exe "%1" जैसी रजिस्ट्री में उद्धरण चिह्नों में %1 को गले लगाकर मैं इसे ठीक कर सकता हूं, लेकिन जब मैं अन्य एप्लिकेशन की रजिस्ट्री की जांच करता हूं तो उन्होंने ऐसा नहीं किया। वे notepad.exe %1 की तरह सादे हैं - उन्हें पूर्ण कमांड लाइन मिल गई है। मैं जानना चाहता हूं कि यह .NET और कैसे संभव है।

उत्तर

22

Environment.CommandLine

+0

क्या आसानी से निष्पादन योग्य नाम को हटाने का कोई तरीका है? –

+1

@ जेरेडबीच, रेसप्लेस (एप्लिकेशन। एक्सटेक्टेबलपैथ, "") –

4

कोशिश उपयोग करके देखें:

Environment.CommandLine

यह बेहतर 30 अक्षर बनाते हैं।

3

अनपेक्षित, कच्ची, अनमोडिफाइड कमांड लाइन प्राप्त करने के लिए आपको कर्नेल 32 से GetCommandLine को P/Invoke करना होगा। कुछ पार्सिंग ऑपरेटिंग सिस्टम द्वारा की जाएगी। उदाहरण के लिए, >foo.txt जैसे आईओ रीडायरेक्शन को इस्तेमाल की जाने वाली तकनीक के बावजूद कमांड लाइन टेक्स्ट से बाहर रखा जाएगा।

पर्यावरण। कमांडलाइन पर्याप्त हो सकती है, लेकिन ध्यान रखें कि यह तर्कों के बीच अंतरालीय रिक्त स्थान को हटा देता है (जब तक कि तर्क स्वयं उद्धरणों में संलग्न न हो) और यह उद्धृत तर्कों से उद्धरण हटा देता है।

उदाहरण के लिए

, कमांड लाइन के लिए:

test.exe this is "a test"

Environment.CommandLine के बराबर होती है: "this is a test"

लेकिन GetCommandLine पैदावार: "test.exe this is "a test"" रिक्त स्थान और उद्धरण बरकरार, के साथ साथ exe का मार्ग।

नोट है कि जब इस तकनीक का इस्तेमाल, तो आप मैन्युअल कमांड लाइन पाठ पार्स करने के लिए, exe के मार्ग से हटकर अलग करना शामिल हो सकता है जो है, जो अपने आप उद्धरण में संलग्न किया जा सकता है, तो पथ स्पेस हैं।

+1

हू, आपके द्वारा वर्णित व्यवहार को न दिखाएं। 'पर्यावरण। कमांडलाइन' सभी मामलों में 'PInvoke' से मेल खाता है। –

+0

मुझे .NET 4.5.2 में PInvoke से 'Environment.CommandLine' के समान परिणाम भी मिलते हैं। – DeCaf

+0

आप सही हैं। दोनों मेरे वर्तमान सिस्टम सेटअप पर एक ही परिणाम दे रहे हैं। मैंने नमूना ऐप और सिस्टम को ट्रैक नहीं किया है जिसका उपयोग मैंने परीक्षण किया था (यह एक साल पहले था), लेकिन अगर यह कभी टूटा हुआ था, तो यह आज के पुराने ओएस + .NET + कंपाइलर संस्करण सेट से होना चाहिए जो वर्तमान में है। यह उदाहरण के लिए, वीएस के केवल पुराने अपडेट पर लागू हो सकता है। निश्चित नहीं है कि कौन से संस्करण। जब मुझे मौका मिलता है, तो मैं यह पता लगाने की कोशिश करूंगा कि मैंने कौन से संस्करणों का उपयोग किया था। भले ही, आप सही हैं कि यह वर्तमान सॉफ्टवेयर में स्पष्ट नहीं है। शायद किसी बिंदु पर एक बग फिक्स था? मैं निष्कर्ष नहीं लगा सकता कि यह किसी बिंदु पर सच नहीं था। धन्यवाद। – Wyck

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