Ошибка Powershell, когда переменная окружения находится в пути - PullRequest
1 голос
/ 20 января 2020

Когда я пытаюсь получить файл по следующему пути - он терпит неудачу:

$path = Get-ItemProperty -Path "%ProgramFiles%\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll"

или

$moduleVersion = [System.Diagnostics.FileVersionInfo]::GetVersionInfo("%ProgramFiles%\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll").FileVersion

Есть ли обходной путь для этого в powershell?

Когда я указываю «полный путь», он работает нормально, но я не контролирую значение. Поэтому я ожидаю, что путь будет разрешен автоматически, как при вставке его непосредственно в Проводник ... но этого не происходит.

Get-ItemProperty: Невозможно найти путь 'C: \ Users \ xxxx \ Documents \ yyyy \% ProgramFiles% \ IIS \ Asp. Net Базовый модуль \ V2 \ aspnetcorev2.dll ', так как он не существует.

РЕДАКТИРОВАТЬ 1 Я пытался применить исправление Regex, но оно не работает:

    $path = "%ProgramFiles%\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll";
    $path = $path -replace "\%(.*?)\%", '$env:$1'
    $path2 = Get-ItemProperty -Path "%ProgramFiles%\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll" #does not work
    $path3 = Get-ItemProperty -Path "$env:ProgramFiles\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll" #works
    $path4 = Get-ItemProperty -Path $path #does not work

Может кто-нибудь объяснить, почему path3 работает, а path4 нет? значения одинаковы. Все еще пытаюсь заставить это работать.

Ответы [ 2 ]

1 голос
/ 20 января 2020

Сам PowerShell не поддерживает ссылки на переменные окружения в стиле cmd.exe, такие как %ProgramFiles% в расширяемые строки ("..."); эквивалент PowerShell равен $env:ProgramFiles. [1]

Если имя переменной содержит специальные символы., заключите имя в {...}; например, ${env:ProgramFiles(x86)}.

Используйте метод System.Environment.ExpandEnvironmentVariables для расширения ссылок на переменные окружения в стиле cmd.exe, таких как %ProgramFiles%, которые встроены в строка большего размера :

$path = [Environment]::ExpandEnvironmentVariables(
  '%ProgramFiles%\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll'
)

Примечание: ссылки на undefined env. переменные остаются нетронутыми.

Вы также можете встроить приведенное выше выражение непосредственно в вызовы командлета, используя (...) (отформатировано для удобства чтения):

$path = Get-ItemProperty -Path (
  [Environment]::ExpandEnvironmentVariables(
    '%ProgramFiles%\IIS\Asp.Net Core Module\V2\aspnetcorev2.dll'
  )
)

[1] И если бы кто-то дал вам дословную строку, содержащую такие ссылки, вам нужно было бы развернуть строку по требованию , что несколько неясно работает, например, следующим образом:
$verbatim = '$env:ProgramFiles\IIS'; $ExecutionContext.InvokeCommand.ExpandString($verbatim)

1 голос
/ 20 января 2020

Вы можете расширить путь ProgramFiles, используя [Environment]::GetEnvironmentVariable("ProgramFiles"). После этого вы можете построить полный путь, используя функцию Combine .

$programFiles = [Environment]::GetEnvironmentVariable("ProgramFiles")
$aspPath = [IO.Path]::Combine($programFiles, "IIS\Asp.Net Core Module\V2\aspnetcorev2.dll")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...