Использование переменных вне функции - PullRequest
1 голос
/ 04 апреля 2020

Я сейчас пишу свой первый скрипт на Powershell и уже сталкиваюсь с первой проблемой. Я хотел бы прочитать значение из переменной в функции, чтобы я мог использовать эту переменную в другом cmd-let позже. Проблема в том, что переменная распознается только внутри функционального блока, а не снаружи. Как мне заставить это работать?

Спасибо за помощь: -)

function Write-Log([string]$logtext, [int]$level=0)
{
  if($level -eq 0)
{
    $logtext = "[INFO] " + $logtext
    $text = "["+$logdate+"] - " + $logtext
    Write-Host $text
}
}

Send-MailMessage -To "<xxx@xxx.de>" -Subject "$text" -Body "The GPO backup creation was completed with the following status: `n $text" -SmtpServer "xxx@xxx.de" -From "xxx@xxx.de"

Я хотел бы отправить $ text

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Это связано с поведением переменной области видимости в PowerShell.

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

function Print-X
{
  Write-Host $X
}

$X = 123
Print-X # prints 123
$X = 456 
Print-X # prints 456

Пока все хорошо. Но когда мы начинаем запись в переменные вне самой функции, PowerShell прозрачно создает новую переменную внутри собственной области действия функции:

function Print-X2
{
  Write-Host $X   # will resolve the value of `$X` from outside the function
  $X = 999        # This creates a new `$X`, different from the one outside
  Write-Host $X   # will resolve the value of the new `$X` that new exists inside the function
}

$X = 123
Print-X2       # Prints 123, and 999
Write-Host $X  # But the value of `$X` outside is still 123, unchanged

Итак, что делать? Вы могли бы использовать модификатор области видимости для записи в переменную вне функции, но реальное решение здесь состоит в том, чтобы вернуть значение из функции вместо этого:

function Write-Log([string]$logtext, [int]$level=0, [switch]$PassThru = $true)
{
    if($level -eq 0)
    {
        $logtext = "[INFO] " + $logtext
        $text = "["+$logdate+"] - " + $logtext
        Write-Host $text
        if($PassThru){
            return $text
        }
    }
}

$logLine = Write-Log "Some log message" -PassThru

Send-MailMessage -Subject $logLine ...
0 голосов
/ 04 апреля 2020

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

$global:myglobalvariable="This is a PowerShell global variable"

или, если она имеет значение null

$global:myglobalvariable2 = $null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...