Как вызвать функцию из другой функции внутри того же скрипта в Powershell/Powershell Core?

Рассмотрим пример кода скрипта 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 ответ

Решение

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

Если вы удалите -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;
Другие вопросы по тегам