it-swarm-eu.dev

PowerShell: combinaison de chemins à l'aide d'une variable

Cela doit être quelque chose d'évident, mais je ne peux pas faire fonctionner cela.

J'essaie de construire une variable qui devrait contenir le chemin d'accès à un fichier existant, en utilisant une variable d'environnement ($env:programfiles(x86)). Cependant, je continue à recevoir des erreurs et je ne vois pas pourquoi.

Cela fonctionne bien (si le fichier existe):

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

Cependant, cela ne:

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

Que se passe-t-il et comment y remédier?

14
jeroenh

Voici ce qui se passe ...

Dans tout chemin Windows PowerShell, les caractères ou espaces vides doivent être entourés d'un ensemble de guillemets ou de crochets. La variable d'environnement PowerShell pour la C:\Program Files (x86) est ${env:ProgramFiles(x86)}, pas $env:ProgamFiles(x86) car PowerShell doit échapper aux espaces vides dans le chemin réel.

Si vous utilisez la variable d'environnement explicite '$ {env: ProgramFiles (x86)}', cela fonctionne parfaitement.


Cela ne fonctionnera pas ...

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.

ou ça ...

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

Mais cela fonctionne très bien ...

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
23
thoughtpunch

C'est bizarre et ça ressemble à un bug. En fait, il résout le $env:programfiles variable et en ajoutant le reste de la chaîne - qui dans ce cas se trouve être (x86).

Cela fonctionnera cependant:

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