2009-05-22 3 views
14

मैं PowerShell स्क्रिप्ट को C# WPF ऐप को कॉल करने के लिए System.Management.Automation API का उपयोग कर रहा हूं। निम्न उदाहरण में, आप प्रारंभ निर्देशिका ($ PWD) को कैसे बदलेंगे, इसलिए यह f..p1 को .exe के स्थान के बजाय c: \ scripts \ निष्पादित करता है जिसे इसे से कहा जाता था?.NET से पावरहेल को कॉल करते समय प्रारंभ डीआईआर सेट करना?

using (Runspace runspace = RunspaceFactory.CreateRunspace()) 
{ 
    runspace.Open(); 
    using (Pipeline pipeline = runspace.CreatePipeline()) 
    { 
     pipeline.Commands.Add(@"C:\scripts\foo.ps1"); 
     pipeline.Invoke(); 
    } 
    runspace.Close(); 
} 

उत्तर

8

आपको अपनी PowerShell स्क्रिप्ट के लिए कार्य पथ बदलने के लिए System.Environment.CurrentDirectory बदलने की आवश्यकता नहीं है। ऐसा करने के लिए यह काफी खतरनाक हो सकता है क्योंकि यदि आप अन्य कोड चला रहे हैं जो आपके वर्तमान निर्देशिका से संवेदनशील है तो इसमें अनजाने दुष्प्रभाव हो सकते हैं।

चूंकि आप एक Runspace प्रदान कर रहे हैं, तुम सब करने की SessionStateProxy पर Path गुण सेट किया गया है की जरूरत है:

using (Runspace runspace = RunspaceFactory.CreateRunspace()) 
{ 
    runspace.Open(); 
    runspace.SessionStateProxy.Path.SetLocation(directory); 
    using (Pipeline pipeline = runspace.CreatePipeline()) 
    { 
     pipeline.Commands.Add(@"C:\scripts\foo.ps1"); 
     pipeline.Invoke(); 
    } 
    runspace.Close(); 
} 
+0

वहाँ दूरदराज के कॉल के लिए एक समाधान है? RemoteSessionStateProxy.Path एक PSNotSupportedException फेंकता है। – Rookian

+0

@Rookian: 'सेट-स्थान' cmdlet को चलाने से उस परिदृश्य में आपकी एकमात्र पसंद हो सकती है। –

3

कुछ भी करने के साथ गलत:

pipeline.Commands.AddScript(@"set-location c:\scripts;.\foo.ps1") 

?

-Oisin

1

आप निम्न आदेश

set-location c:\mydirectory 

साथ powershell में काम कर निर्देशिका सेट कर सकते हैं आप भी अपने PowerShell स्टार्टअप स्क्रिप्ट ($ प्रोफाइल) की कोशिश कर सकते हैं। सी: .... \ mydocs \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1 लेकिन तभी जब इस निर्देशिका तय हो गई है और

6

आगे System.Environment.CurrentDirectory स्थापना समय की तुम क्या चाहते हो जाएगा नहीं बदलता है।

बल्कि अपने शेयरों पर आधारित करने के लिए Set-Location जोड़ने से, आप उद्घाटन Runspace पहले किसी भी समय स्थापित करना चाहिए System.Environment.CurrentDirectory। यह प्राप्त कर लेंगे जो कुछ CurrentDirectory जब इसे खोला है:

using (Runspace runspace = RunspaceFactory.CreateRunspace()) 
{ 
    System.Environment.CurrentDirectory = "C:\\scripts"; 
    runspace.Open(); 
    using (Pipeline pipeline = runspace.CreatePipeline()) 
    { 
     pipeline.Commands.Add(@".\foo.ps1"); 
     pipeline.Invoke(); 
    } 
    runspace.Close(); 
} 

और याद रखें, Set-Location .नेट फ्रेमवर्क के CurrentDirectory इसलिए यदि आप कॉल कर रहे हैं नेट तरीकों जो काम निर्धारित नहीं करता है "वर्तमान" स्थान पर, आप इसे खुद स्थापित करने की जरूरत है।

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