Подтвердить что ты не робот

$ MyInvocation.MyCommand.Path, возвращающий NULL

У меня есть следующий код как начало более длинного script:

$ScriptPath = Split-Path $MyInvocation.MyCommand.Path
& $ScriptPath\build_functions.ps1
& $ScriptPath\build_builddefs.ps1

Идея состоит в том, чтобы запустить путь к script и использовать этот путь для вызова некоторых поддерживающих скриптов. Однако, когда я пошел, чтобы проверить это отдельно, чтобы убедиться, что он может работать (выделив этот блок и запустив именно этот код), я получил следующую ошибку:

Split-Path: Cannot bind argument to parameter 'Path' because it is null.

Интересно, что когда я запускаю весь script, кажется, что они запускают эти файлы по отдельности. Есть ли что-то, что мне не хватает в том, как ISE обрабатывает выбор, а не полный script? Не создает ли контекст файловой системы при запуске выделения?

4b9b3361

Ответ 1

$MyInvocation является автоматической переменной, заполненной script временем выполнения, тогда, если вы выполните $MyInvocation.MyCommand.Path в powershell console или ISE не заполняется;

почему в вашем тесте $ScriptPath не имеет значения ($null)

Ответ 2

Я не знаю, почему со мной произошел поиск значения null в $ MyInvocation.MyCommand.Path, но я объясню, как я нашел решение.

У меня были сценарии, которые работали в производстве, но когда я загрузил файл .ps1 и попытался получить $ MyInvocation.MyCommand.Path, он был нулевым. Моя версия Powershell была 4.0, но 1.0 для ISE (% windir%\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe).

Но сначала мне не приходило в голову, почему они должны работать, но когда я вручную проверял $ MyInvocation.MyCommand.Path или $ MyInvocation в PowerShell, почему он был пустым и почему я получал нулевую ошибку для Split-Path [CN00 ] $ MyInvocation.MyCommand.Path.

Поэтому я подумал, что мне нужно обновить PowerShell до 5.1 на моем Windows 2012 R2 Server, как на настольном ПК NUC.

Реальная проблема заключалась в том, что я обнаружил, что если я установил точку останова в своем файле .ps1 и запустил ее до места, где я делал:

$ ScriptDir = Split-Path -parent $ MyInvocation.MyCommand.Path

Это сработало. Конечно, это работало, я использовал это некоторое время. Почему я не видел это раньше?

Что пошло не так? Я пытался вручную запустить PowerShell по частям, используя команду запуска шага, когда я никогда не запускал сценарий раньше, так как PowerShell был открыт!

Я должен сказать, что это, вероятно, момент без духа.

Но недавно у нас произошел сбой сервера, и он был восстановлен (VSphere Clustered) и перезапущен, поэтому я подумал, может быть, у меня есть более старая версия PowerShell.

PowerShell позволяет вам открывать несколько файлов/окон, но переменные совместно используются ими. Очевидно, что до тех пор, пока вы на самом деле не попробуете запустить скрипт (не пошаговый запуск), у него нет исполняемого файла скрипта и вы не сможете найти путь.

Я надеюсь, что этот пост спасет кого-то от траты времени, как я!