2010-12-13 35 views
13

To musi być coś oczywistego, ale nie mogę tego uruchomić.powershell: łączenie ścieżki za pomocą zmiennej

Próbuję utworzyć zmienną, która powinna zawierać ścieżkę do istniejącego pliku przy użyciu zmiennej środowiskowej ($ env: programfiles (x86)). Jednak ciągle dostaję błędy i nie rozumiem, dlaczego.

To działa prawidłowo (jeśli plik istnieje):

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

Jednak to nie:

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 

Co się dzieje i jak to naprawić?

+1

Czy brakujące miejsce w drugim przykładzie to tylko literówka? "Program Files (x86)" w porównaniu z "Program Files (x86)" – craika

+0

to nie jest, dostaję go również bez miejsca. bardzo dziwne – CharlesB

+2

nie, w systemie 64-bitowym masz dwie zmienne env: $ {env: programfiles} i $ {env: programfiles (x86)} – jeroenh

Odpowiedz

20

Oto co się dzieje ...

W żadnej ścieżki Windows PowerShell pustych znaków lub przestrzenie muszą być otoczone z zestawem cytatów lub wsporników. Zmienna środowiskowa Powershell dla plików C: \ Program Files (x86) jest ${env:ProgramFiles(x86)}, a nie $env:ProgamFiles(x86), ponieważ PowerShell musi uciec z pustych przestrzeni w prawdziwej ścieżce.

Jeśli użyjesz zmiennej środowiskowej $ {env: ProgramFiles (x86)}, to działa ona idealnie.


To nie zadziała ...

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. 

czy to ....

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 

Ale to działa świetnie ....

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 

Mam nadzieję, że to pomoże!

~ Dan

+5

Na poprzednim plakacie to nie jest błąd. W składni Powershell nawiasy oznaczają parametr, który jest przekazywany do polecenia cmdlet lub skryptu. Ponieważ w magazynach zmiennych środowiskowych ścieżka zawiera zestaw nawiasów, zmienna musi zostać zmieniona i przeanalizowana pomiędzy $ {}. Aby zobaczyć, co mam na myśli, spróbuj wprowadzić zmienną z nawiasami, na przykład $ psy (areawesome) lub $ programy (x64), a otrzymasz "nieoczekiwany token" ("w wyrażeniu lub oświadczeniu." Programiści Powershell mogliby uniknąć ten problem, tworząc zmienną środowiskową "$ env: ProgramFilesx86". – thoughtpunch

+0

wielkie wyjaśnienie, dziękuję – jeroenh

+4

Twoja odpowiedź jest poprawna, ale powodem nie jest. Przestrzeń w wynikowej ścieżce nie ma nic wspólnego z tym, dlaczego ten konkretny envvar wymaga '{}'. Jeśli tak, to '$ env: ProgramFiles' również wymagałoby' {} ', ale tak nie jest. Przyczyna niepowodzenia programu ProgramFiles (x86) jest czysto problem z parserem. Kiedy analizator analizuje '$ env: ProgramFiles (x86)', widzi nowe wyrażenie 'Group', gdy widzi parens otwierania, który jest niepoprawny, biorąc pod uwagę bieżący kontekst. Możesz to zobaczyć za pomocą tokenarza PowerShell, np .: '[management.automation.psparser] :: Tokenize (" $ env: ProgramFiles (x86) ', [ref] $ errors) ". –

1

To dziwne. Wygląda jak błąd. W rzeczywistości jednak rozwiązuje zmienną $ env: programfiles i dołącza resztę łańcucha - który w tym przypadku akurat jest (x86).

to będzie działać mimo:

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