2011-01-11 11 views
31

Wie erhält man in einem PowerShell-Skript den Wert einer Umgebungsvariablen, deren Name Klammern enthält?Variablen der Umgebungsvariablen mit Klammern, wie% ProgramFiles (x86)%, in PowerShell?

Um die Sache zu komplizieren, enthalten einige Variablen Namen Klammern, während andere ähnliche Namen ohne Klammern haben. Zum Beispiel (unter Verwendung von cmd.exe):

C:\>set | find "ProgramFiles" 
CommonProgramFiles=C:\Program Files\Common Files 
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files 
ProgramFiles=C:\Program Files 
ProgramFiles(x86)=C:\Program Files (x86) 

Wir sehen, dass %ProgramFiles% nicht die gleiche wie %ProgramFiles(x86)% ist.

Mein PowerShell-Code schlägt auf seltsame Weise fehl, weil er den Teil des Namens der Umgebungsvariablen nach den Klammern ignoriert. Da dies passiert, um den Namen einer anderen, aber vorhandene, Umgebungsvariable nicht fehlschlagen, ich bekomme nur den richtigen Wert der falschen Variable.

Hier ist eine Testfunktion in der Sprache Powershell Scripting mein Problem zu veranschaulichen:

function Do-Test 
{ 
    $ok = "C:\Program Files (x86)"  # note space between 's' and '(' 
    $bad = "$Env:ProgramFiles" + "(x86)" # uses %ProgramFiles% 

    $d = "${ Env:ProgramFiles(x86) }" # fail (2), LINE 6 
# $d = "$Env:ProgramFiles(x86)"  # fail (1) 

    if ($d -eq $ok) { 
     Write-Output "Pass" 
    } elseif ($d -eq $bad) { 
     Write-Output "Fail: (1) %ProgramFiles% used instead of %ProgramFiles(x86)%" 
    } else { 
     Write-Output "Fail: (2) some other reason" 
    } 
} 

Und hier ist der Ausgang:

PS> Do-Test 
Fail: (2) some other reason 

Gibt es eine einfache Änderung, die ich 6 oben auf der Linie machen kann den richtigen Wert von% ProgramFiles (x86)% erhalten?

HINWEIS: Im Text dieses Beitrags verwende ich Stapeldateisyntax für Umgebungsvariablen als bequeme Kurzschrift. Zum Beispiel bedeutet% SOME_VARIABLE% "den Wert der Umgebungsvariablen, deren Name SOME_VARIABLE ist". Wenn ich die Syntax in PowerShell richtig umgehen würde, müsste ich diese Frage nicht stellen.

+0

Vielleicht nützlich: http://geekswithblogs.net/Lance/archive/2009/12/29/program-file-environment-variable-in-powershell.aspx – Kiquenet

Antwort

50

Einfach. Ändern Sie Zeile 6, um die Leerzeichen in den Klammern zu entfernen:

$d = "${Env:ProgramFiles(x86)}"  # LINE 6 (NO spaces inside brackets) 

Sie müssen nur die Variable, die enthält() mit {} umbrechen. Keine Leerzeichen in den Klammern.

+1

Dank @ravikanth! Ich hatte mit "$ {Env: ProgramFiles (x86)}" gescheitert, beachten Sie, dass es Leerzeichen enthält. Ich hätte erkennen müssen, dass sich dies von "$ {Env: ProgramFiles (x86)}" unterscheidet, die KEINE Leerzeichen enthalten. Ich habe Ihrer Antwort einen zusätzlichen Text hinzugefügt. – jwfearn

+0

Ich entfernte zusätzliche Zeilen, die die gleichen wie in meinem Beitrag sind. Ich hoffe, es macht dir nichts aus. – jwfearn

+0

Ja, danke für das Update :) – ravikanth

Verwandte Themen