Как вызвать функцию из другой функции внутри того же скрипта в 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;