2010-12-13 17 views
13

Bu açık bir şey olmalı, ancak bunu işe alamıyorum.powershell: bir değişken kullanarak yolu birleştirmek

Bir ortam değişkeni ($ env: programfiles (x86)) kullanarak varolan bir dosyanın yolunu içermesi gereken bir değişken oluşturmaya çalışıyorum. Ancak hata yapmaya devam ediyorum ve nedenini göremiyorum.

Bu (dosya varsa) iyi çalışır:

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:\> 

Ancak bu değildir:

neler oluyor
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 

ve nasıl düzeltebilirim?

+1

İkinci örnekte eksik alan yalnızca bir yazım hatası mı? "Program Dosyaları (x86)" vs "Program Dosyaları (x86)" – craika

+0

değil, ben de boşluğum olsun. çok garip – CharlesB

+2

no, 64bit sistemde iki env değişkenini alırsınız: $ {env: programfiles} ve $ {env: programfiles (x86)} – jeroenh

cevap

20
İşte

neler olduğunu olduğunu ...

tırnak veya parantez kümesi ile çevrili olması gerekir. Powershell ortam değişkeni, C: \ Program Files (x86) $env:ProgamFiles(x86) değil ${env:ProgramFiles(x86)} değil, çünkü Powershell gerçek yoldaki boş alanlardan kaçmak zorunda.

'$ {env: ProgramFiles (x86)}' açık ortam değişkeni kullanırsanız, mükemmel çalışır. bu büyük işleri

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 

Ama


Bu işe yaramaz ...

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. 

veya bu .... ....

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 

Bu yardımcı olur umarız!

~ Dan

+5

Önceki poster için bu bir hata değildir. Powershell sözdiziminde, parantezler bir cmdlet veya komut dosyasına geçirilen bir parametreyi gösterir. Ortam değişkeni depolayan bir yolun içinde bir parantez kümesi bulunduğundan, değişkenin $ {} arasında kaçıp değerlendirilmesi gerekir. Ne demek istediğimi görmek için parantez içinde bir değişken oluşturmayı deneyin, örneğin $ dogs (areawesome) veya $ programlar (x64) ve 'Beklenmeyen bir jeton' ('ifade veya deyimde' alırsınız. Powershell kodlayıcılar önlenebilirdi Bu sorun, "$ env: ProgramFilesx86" ortam değişkenini oluşturarak. – thoughtpunch

+0

harika bir açıklama, teşekkürler – jeroenh

+4

Cevabınız doğru ama nedeni değil. Ortaya çıkan yoldaki bir alanın, bu özel envvarın niçin '{}' gerektirdiği ile hiçbir ilgisi yoktur. Eğer öyleyse, '$ env: ProgramFiles' da' {} 'gerektiriyordu, ancak öyle değil. ProgramFiles'in (x86) yanlış davranmasının nedeni tamamen çözümleyici bir sorundur. Ayrıştırıcı '$ env: ProgramFiles (x86)' değerlendirirken, mevcut bağlamda geçerli olmayan açılış parantezlerini gördüğünde yeni bir 'Grup' ifadesi görür. Bunu PowerShell tokenizer ile görebilirsiniz: örn .: [management.automation.psparser] :: Tokenize ('$ env: ProgramFiles (x86)', [ref] $ errors) '. –

1

Bu garip. Bir böcek gibi görünüyor. Aslında ne yapıyor olsa da, $ env: programfiles değişkenini çözüyor ve dizenin geri kalanını ekliyor - ki bu durumda (x86).

Bu olsa çalışır: herhangi bir Windows Powershell yol boş karakterler veya mekanlarda

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