2012-06-28 5 views
8

जब आप PowerShell से .NET ऑब्जेक्ट का उपयोग करते हैं, और यह एक फ़ाइल नाम लेता है, तो यह हमेशा C:\Windows\System32 के सापेक्ष लगता है।PowerShell में .NET ऑब्जेक्ट्स वर्तमान निर्देशिका का उपयोग क्यों नहीं करते हैं?

उदाहरण के लिए:

[IO.File]::WriteAllText('hello.txt', 'Hello World') 

... C:\Windows\System32\hello.txt, बल्कि C:\Current\Directory\hello.txt

क्यों PowerShell इस करता है की तुलना में लिखेंगे? क्या यह व्यवहार बदला जा सकता है? अगर इसे बदला नहीं जा सकता है, तो मैं इसके आसपास कैसे काम करूं?

मैंने Resolve-Path को आजमाया है, लेकिन यह केवल उन फ़ाइलों के साथ काम करता है जो पहले से मौजूद हैं, और यह हर समय करने के लिए बहुत ही वर्बोज़ है।

+1

संभव डुप्लिकेट वर्तमान निर्देशिका के बजाय $ home?] (http://stackoverflow.com/questions/4071775/why-is-powershell-resolving-paths-from-home-instead-of-the-current-directory) –

उत्तर

7

कारणों PowerShell वर्तमान कार्यशील निर्देशिका का नेट धारणा में नहीं रखता है काम कर निर्देशिका की PowerShell के धारणा के साथ सिंक कर रहे हैं:

  1. PowerShell काम कर dirs एक प्रदाता है कि यहां तक ​​कि फाइल नहीं प्रणाली आधारित जैसे में हो सकता है एचकेएलएम: \ सॉफ्टवेयर
  2. एक एकल पावरशेल प्रक्रिया में एकाधिक रनस्पेस हो सकते हैं। प्रत्येक रनस्पेस एक अलग फ़ाइल सिस्टम स्थान में cd`d हो सकती है। हालांकि .NET/प्रक्रिया "कार्यशील निर्देशिका" अनिवार्य रूप से प्रक्रिया के लिए वैश्विक है और परिदृश्य के लिए काम नहीं करेगी जहां कई काम करने वाले डीआईआर (एक प्रति रनस्पेस) हो सकते हैं।
+1

पर्याप्त मेला। क्या सामान्य पावरशेल प्रक्रिया में एकाधिक रनपेस हो सकते हैं? –

+2

@RogerLipscombe PowerShell.exe के लिए एकाधिक रनस्पेस का उपयोग करने के लिए यह बहुत आम नहीं है लेकिन PowerShell इंजन क्षमता प्रदान करता है। PowerShell_ISE और PowerGUI जैसे अन्य होस्ट एक ही प्रक्रिया में एकाधिक रनस्पेस का लाभ उठाते हैं। आईएसई को फायर करें, Ctrl + T (नया पावरहेल टैब) दबाएं और प्रत्येक टैब में $ ExecutionContext.Host.Runspace.InstanceId के बाद $ pid चलाएं। ध्यान दें कि प्रक्रिया आईडी समान है लेकिन रनस्पेस आईडी अलग है। –

0

शायद ऐसा इसलिए है क्योंकि PowerShell System32 में चल रहा है। जब आप PowerShell में किसी निर्देशिका में cd करते हैं, तो यह वास्तव में powershell.exe की कार्य निर्देशिका को परिवर्तित नहीं करता है।

देखें:

PowerTip article on syncing the two directories

Channel9 forum thread

+0

यह पता चला है कि यह http: // stackoverflow का डुप्लिकेट है।कॉम/प्रश्न/4071775/क्यों-शक्ति-समाधान-पथ-से-घर-बदले में-वर्तमान-निर्देशिका है, लेकिन क्योंकि मैं ऊंचा चल रहा हूं, यह $ HOME नहीं है। –

+0

हाँ, यह ऐसा करेगा - यद्यपि यदि आप ऊंचे नहीं थे और आपने 'cd $ फ़ोल्डर 'किया था तो आप' $ HOME' पर काम करेंगे। लेकिन मूल रूप से यही कारण है कि यह $ पीडब्ल्यूडी का सम्मान नहीं कर रहा था - क्योंकि वह कोड प्रभावी ढंग से प्रक्रिया कार्यशील निर्देशिका के लिए विंडोज से पूछ रहा था, लेकिन $ पीडब्ल्यूडी वैरिएबल एक पावरशेल आर्टिफैक्ट है, विंडोज़ नहीं। – JohnL

0

आप नेट तरीकों में फ़ाइल नाम का उपयोग करते हैं, सबसे अच्छा अभ्यास पूरी तरह से योग्य पथ नाम का प्रयोग है। या

`$pwd\foo.cer` 

का उपयोग आप से powershell कंसोल में क्या है:

C:\> [Environment]::CurrentDirectory 

C:\WINDOWS\system32\WindowsPowerShell\v1.0 

आप क्या फ़ोल्डर .net उपयोग देख सकते हैं।

+1

स्क्रिप्ट में पर्याप्त मेला। कमांड लाइन पर पुरानी असली जल्दी हो जाता है। –

0

मैं एक लंबे समय पहले एक ही समस्या में पड़ गए और अब मैं अपने प्रोफ़ाइल की शुरुआत करने के लिए निम्नलिखित जोड़ें:

# Setup user environment when running session under alternate credentials and 
# logged in as a normal user. 
if ((Get-PSProvider FileSystem).Home -eq "") 
{ 
    Set-Variable HOME $env:USERPROFILE -Force 
    $env:HOMEDRIVE = Split-Path $HOME -Qualifier 
    $env:HOMEPATH = Split-Path $HOME -NoQualifier 
    (Get-PSProvider FileSystem).Home = $HOME 
    Set-Location $HOME 
} 
+0

यह उत्तर देता है कि यह System32 क्यों है, मेरी टिप्पणी में, धन्यवाद; लेकिन यह सीधे सवाल का जवाब नहीं देता है। –

15

आप काम कर रहे dir काम कर निर्देशिका PowerShell को .net बदल सकते हैं:
[Environment]::CurrentDirectory = (Get-Location -PSProvider FileSystem).ProviderPath
इस लाइन के बाद [io.path]::GetFullPath और [IO.File]::WriteAllText की तरह सभी .net तरीकों समस्याओं के बिना काम करेंगे

[से क्यों PowerShell को हल है रास्तों में से
संबंधित मुद्दे