2010-12-13 4 views
13

का उपयोग करके पथ को संयोजित करना यह कुछ स्पष्ट होना चाहिए, लेकिन मैं इसे काम पर नहीं ला सकता।शक्तियां: एक चर

मैं एक वैरिएबल बनाने की कोशिश कर रहा हूं जिसमें एक पर्यावरण चर ($ env: programfiles (x86)) का उपयोग कर मौजूदा फ़ाइल का पथ होना चाहिए। हालांकि मुझे त्रुटियां मिल रही हैं, और मैं यह देखने में असफल रहा कि क्यों।

यह ठीक काम करता है (यदि फ़ाइल मौजूद है):

PS C:\> $f = "C:\Program Files (x86)" + '\sometextfile.txt' 
PS C:\> $f 
C:\Program Files (x86)\sometextfile.txt 
PS C:\> gci $f 
    Directory: C:\Program Files (x86) 
Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---  13/12/2010  14:03   0 sometextfile.txt 
PS C:\> 

बहरहाल, यह नहीं करता है:

PS C:\> "$env:programfiles(x86)" 
C:\Program Files(x86) 
PS C:\> $f = "$env:ProgramFiles(x86)" + '\sometextfile.txt' 
PS C:\> $f 
C:\Program Files(x86)\sometextfile.txt 
PS C:\> gci $f 
Get-ChildItem : Cannot find path 'C:\Program Files(x86)\sometextfile.txt' because it does not exist. 
At line:1 char:4 
+ gci <<<< $f 
    + CategoryInfo   : ObjectNotFound: (C:\Program Files(x86)\sometextfile.txt:String) [Get-ChildItem], ItemNot 
    FoundException 
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand 

क्या हो रहा है, और इसे ठीक करने के लिए?

+1

दूसरे उदाहरण सिर्फ एक टाइपो में लापता अंतरिक्ष है? "प्रोग्राम फ़ाइलें (x86)" बनाम "प्रोग्राम फ़ाइलें (x86)" – craika

+0

यह नहीं है, मुझे बिना अंतरिक्ष के भी मिलता है। बहुत अजीब – CharlesB

+2

नहीं, 64 बिट सिस्टम पर आपको दो एनवी चर मिलते हैं: $ {env: programfiles} और $ {env: programfiles (x86)} – jeroenh

उत्तर

20

यहाँ क्या हो रहा है ...

किसी भी Windows PowerShell पथ खाली वर्णों या स्थानों में उद्धरण या कोष्ठक का एक सेट के साथ घिरा हो की जरूरत है। C: \ Program Files (x86) के लिए पावरहेल पर्यावरण चर ${env:ProgramFiles(x86)}$env:ProgamFiles(x86) नहीं है क्योंकि पावरहेल को वास्तविक पथ में खाली रिक्त स्थान से बचने की आवश्यकता है।

यदि आप '$ {env: ProgramFiles (x86)}' स्पष्ट पर्यावरण चर का उपयोग करते हैं, तो यह पूरी तरह से काम करता है।


यह काम नहीं करेगा ...

PS C:\> cd "$env:programfiles(x86)" 
Set-Location : Cannot find path 'C:\Program Files(x86)' because it does not e 
At line:1 char:3 
+ cd <<<< "$env:programfiles(x86)" 
+ CategoryInfo   : ObjectNotFound: (C:\(x86):String) 
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell. 

या इस ....

PS C:\> $env:ProgramFiles(x86) 
Unexpected token '(' in expression or statement. 
At line:1 char:19 
+ $env:ProgramFiles(<<<< x86) 
+ CategoryInfo   : ParserError: ((:String) [], Parent 
+ FullyQualifiedErrorId : UnexpectedToken 

लेकिन यह अच्छा काम करता है ....

PS C:\> ${env:ProgramFiles(x86)} 
C:\Program Files (x86) 
PS C:\> $f = "${env:ProgramFiles(x86)}" + "\sometextfile.txt" 
PS C:\> $f 
C:\Program Files (x86)\sometextfile.txt 
PS C:\> gci $f 
Directory: C:\Program Files (x86) 


Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---  12/13/2010 8:58 AM   0 sometextfile.txt 

आशा है कि इससे मदद मिलती है!

~ दान

+5

पिछले पोस्टर के अनुसार, यह एक बग नहीं है। पावरहेल सिंटैक्स में, कोष्ठक एक पैरामीटर इंगित करते हैं जो cmdlet या स्क्रिप्ट को पास हो जाता है। चूंकि पर्यावरण परिवर्तनीय स्टोर्स में पथ में ब्रांड्स का एक सेट होता है, इसलिए परिवर्तनीय को $ {} के बीच में भागने और मूल्यांकन करने की आवश्यकता होती है। मेरा मतलब यह देखने के लिए, इसमें वैरिएबल के साथ एक वैरिएबल बनाने का प्रयास करें, उदाहरण के लिए $ कुत्तों (अजीब) या $ प्रोग्राम (x64) और आपको 'अनपेक्षित टोकन' ('अभिव्यक्ति या कथन में' मिलेगा। पावरहेल कोडर से बचा जा सकता था पर्यावरण परिवर्तक "$ env: ProgramFilesx86" बनाकर यह समस्या। – thoughtpunch

+0

महान स्पष्टीकरण, धन्यवाद – jeroenh

+4

आपका उत्तर सही है लेकिन कारण नहीं है। परिणामी पथ में एक जगह के साथ कुछ भी नहीं है कि इस विशेष envvar क्यों '{}' की आवश्यकता है। यदि ऐसा हुआ, तो '$ env: ProgramFiles 'को भी' {} 'की आवश्यकता होगी लेकिन ऐसा नहीं है। कारण प्रोग्रामफाइल (x86) misbehaves पूरी तरह से एक पार्सर मुद्दा है। चूंकि पार्सर '$ env: ProgramFiles (x86)' का मूल्यांकन करता है, यह एक नया 'समूह' अभिव्यक्ति देखता है जब यह शुरुआती माता-पिता को देखता है जो वर्तमान संदर्भ के अनुसार मान्य नहीं है। आप इसे PowerShell टोककेज़र उदाहरण के साथ देख सकते हैं: '[management.automation.psparser] :: टोकनिज ('$ env: ProgramFiles (x86)', [ref] $ त्रुटियां)'। –

1

यह अजीब है। एक बग की तरह लग रहा है। वास्तव में यह वास्तव में क्या कर रहा है हालांकि $ env को हल कर रहा है: प्रोग्रामफाइल चर और शेष स्ट्रिंग को जोड़ना - जो इस मामले में बस होता है (x86)।

यह हालांकि काम करेंगे:

$f = ${env:ProgramFiles(x86)} + '\sometextfile.txt'