PowerShell: la combinaison de tracés à l'aide d'une variable
Ce doit être quelque chose d'évident, mais je ne peux pas obtenir que cela fonctionne.
Je suis en train de construire une variable qui doit contenir le chemin d'accès à un fichier existant, à l'aide d'une variable d'environnement ($env:programfiles(x86)
). Cependant je continue à faire 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:\>
Toutefois, cela ne signifie pas:
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
Ce qui se passe, et comment puis-je résoudre ce problème?
- Est le manque d'espace dans le deuxième exemple, juste une faute de frappe? "Program Files (x86)" vs "Program Files(x86)"
- il n'est pas, je l'obtenir sans trop d'espace. très étrange
- non, sur un système 64 bits, vous obtenez deux variables d'environnement: ${env:programfiles} et ${env:programfiles(x86)}
- Peut-être utile: geekswithblogs.net/Lance/archive/2009/12/29/...
Vous devez vous connecter pour publier un commentaire.
Voici ce qui se passe...
Dans aucun chemin d'accès Windows PowerShell vide des caractères ou des espaces besoin d'être entouré, avec un jeu de guillemets ou de crochets. Le PowerShell variable d'environnement pour le
C:\Program Files (x86)
est${env:ProgramFiles(x86)}
, pas$env:ProgamFiles(x86)
depuis PowerShell besoin d'échapper les espaces vides dans le vrai chemin.Si vous utilisez le '${env:ProgramFiles(x86)}' explicite variable d'environnement, il fonctionne parfaitement.
Cela ne fonctionne pas...
ou cela...
Mais cela fonctionne très bien...
{}
. Si elle l'était,$env:ProgramFiles
nécessiterait également{}
mais il ne le fait pas. La raison ProgramFiles(x86) se conduit mal est purement un analyseur de problème. Que l'analyseur évalue$env:ProgramFiles(x86)
, il voit un nouveau "Groupe" expression lorsqu'il voit l'ouverture des parens qui n'est pas valable étant donné le contexte actuel. Vous pouvez voir cela avec le PowerShell générateur de jetons par exemple:[management.automation.psparser]::Tokenize('$env:ProgramFiles(x86)', [ref]$errors)
.Qui est bizarre et qui ressemble à un bug. En fait c'est la résolution de la
$env:programfiles
variable et en ajoutant le reste de la chaîne - qui dans ce cas se trouve être (x86).Cela fonctionne bien: