Локальные переменные всегда видны в одной и той же области (и во всех потомках, если они не созданы с помощью спецификатора области $private:
), поэтому они не являются проблемой.
Однако, выглядит как ваше намерение состоит в том, чтобы основать значение переменной $Log
на уровне сценария определения $MyInvocation
, а не на функции (которая отражает, как функция был вызван).
Ссылка на определение сценария *1016* $MyInvocation
- из которого можно получить имя файла сценария , как и предполагалось - используйте спецификатор области действия $script:
:
$Log = $script:MyInvocation.MyCommand.ToString().Replace(".ps1",".log")
Проще говоря, вы можете использовать automati c $PSCommandPath
переменную , которая содержит полный путь к файлу сценария, даже внутренние функции:
$Log = [IO.Path]::GetFileNameWithoutExtension($PSCommandPath) + '.log'
В PowerShell [Core] 6+ вы также можете использовать Split-Path -LeafBase
(не поддерживается в Windows PowerShell):
$Log = (Split-Path -LeafBase $PSCommandPath) + '.log'
Наконец, для ради полноты, собственная переменная $MyInvocation
функции имеет свойство .PSCommandPath
, которое тоже отражает полный путь к скрипту:
$Log = (Split-Path -LeafBase $MyInvocation.PSCommandPath) + '.log'