Как вызвать функцию из другой функции внутри того же скрипта в Powershell / Powershell Core? - PullRequest
0 голосов
/ 23 сентября 2018

Рассмотрим пример кода сценария importer.ps1

#!/usr/bin/env pwsh

New-Item -Path $profile -Force | Out-Null;

function main {
    if (Test-AlreadyImported) {
        Write-Host "Already Imported.";
    }
    else {
        Add-Content $profile "#My Additions" | Out-Null;
        Add-Content $profile "`$env:PSModulePath = `$env:PSModulePath + `";$PSScriptRoot`";" | Out-Null;
        Write-Host "Import done.";   
    }
}

function Test-AlreadyImported {
    if (Get-Content $profile | Select-String -Quiet "#My Additions") {
        Write-Host "I am true";
        return $true;
    }
    else {
        Write-Host "I am false";
        return $false;
    }
}

main;

Ожидаемый результат после запуска 2 раза:

I am True.
Already Imported.

Фактический вывод после запуска 2 раза:

I am false
Import done.

Если я импортирую функцию Test-AlreadyImported в Powershell и выполню ее, она вернет false.Но в скрипте он всегда возвращает true.

Какую концептуальную ошибку я совершаю?

1 Ответ

0 голосов
/ 23 сентября 2018

-Force для New-Item означает: создать элемент, даже если он уже там (перезаписать).Вновь созданный файл будет пустым, поэтому Test-AlreadyImported всегда возвращает true.

Если вы удалите параметр -Force, будет получен ожидаемый результат.

New-Item -Path $profile -ErrorAction SilentlyContinue | Out-Null;

function main {
    if (Test-AlreadyImported) {
        Write-Host "Already Imported.";
    }
    else {
        Add-Content $profile "#My Additions" | Out-Null;
        Add-Content $profile "`$env:PSModulePath = `$env:PSModulePath + `";$PSScriptRoot`";" | Out-Null;
        Write-Host "Import done.";   
    }
}

function Test-AlreadyImported {
    if (Get-Content $profile | Select-String -Quiet "#My Additions") {
        Write-Host "I am true";
        return $true;
    }
    else {
        Write-Host "I am false";
        return $false;
    }
}

main;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...