Моя функция возвращает список, когда его не должно быть. Я проверяю значения var до и после `return` и я в тупике

#powershell

#powershell

Вопрос:

Я создаю несколько сценариев PS, чтобы помочь автоматизировать некоторые задачи, которые у меня есть. Для запуска этих сценариев мне нужны подписанные файлы. Итак, я пошел по пути создания самоподписывающегося сертификата, и я хотел сделать сценарий немного более надежным, если не перестарался. Я всегда могу вернуться к первой итерации и двигаться дальше, но это так озадачивает меня, мне нужно выяснить, почему это происходит.

пароль и хэши не имеют значения, и я меняю хэши при каждом запуске. Я планирую удалить все поврежденные сертификаты, как только смогу выполнить чистую проверку.

вывод на консоль:

 certpath: Cert:\LocalMachineMy365B361A71F306681B432CE0B9CFCA7327890F47
before exiting makeCert cert[all] 365B361A71F306681B432CE0B9CFCA7327890F47
before exiting makeCert cert[0] 365B361A71F306681B432CE0B9CFCA7327890F47
before exiting makeCert cert[1] 
after exiting makeCert cert[all] C:selfcert1.pfx 365B361A71F306681B432CE0B9CFCA7327890F47
after exiting makeCert cert[0] C:selfcert1.pfx
after exiting makeCert cert[1] 365B361A71F306681B432CE0B9CFCA7327890F47
this is cert Cert:\LocalMachineMyC:selfcert1.pfx 365B361A71F306681B432CE0B9CFCA7327890F47
 
 function makeCert {
    param
    (
        [string] $pass
    )
    write-host "creating cert" -ForegroundColor Yellow
    #generate a new cert, dnsname should be your FQDN
    $cert = New-SelfSignedCertificate -CertStoreLocation $certStore -dnsname "$env:computername.$env:userdnsdomain" -Type CodeSigningCert -FriendlyName "MyCodeSigningCert"
    write-host $cert -ForegroundColor Red
    write-host $cert.Thumbprint -ForegroundColor Red
    $password = ConvertTo-SecureString -String $pass -Force -AsPlainText

    #define the certpath and export the pfx file, if it needs to be shared.
    $certPath = "$certStore$($cert.Thumbprint)"
    Export-PfxCertificate -Cert $certPath -FilePath C:selfcert1.pfx -Password $password -Force
    write-host "cert created" -ForegroundColor Green
    write-host "certpath:"$certPath
    write-host "before exiting makeCert cert[all]"$cert.Thumbprint
    write-host "before exiting makeCert cert[0]"$cert[0].Thumbprint
    write-host "before exiting makeCert cert[1]"$cert[1].Thumbprint
    return ($cert.Thumbprint)
    # return ($cert[0].Thumbprint) referencing the list item with 0 or 1 makes no difference.
    
}

function main {
    param
    (
        [int] $i
    )
    $password = "passw0rd!"
    $certTP = checkCert
    if ($certTP)
    {
        write-host "Cert found"  -ForegroundColor Green
    }
    else
    {
        write-host "No matching code signing cert. Creating new cert" -ForegroundColor Yellow
        write-host "before making cert"$certTP -ForegroundColor Yellow
        $certTP = makeCert -pass $password
        write-host "after exiting makeCert cert[all]"$certTP -ForegroundColor Yellow
        write-host "after exiting makeCert cert[0]"$certTP[0] -ForegroundColor Yellow
        write-host "after exiting makeCert cert[1]"$certTP[1] -ForegroundColor Yellow
        #importCert -pass $password
    }
    if ($i = 1) {
    certSigning -cert "$certStore$certTP"
    }
}


main -i 0
 

Ответ №1:

ну, теперь я чувствую себя довольно глупо. Я понял, откуда возникла проблема внутри функции, но я не прибегал к сохранению вызова экспорта в переменную. В тот момент, когда я это сделал, было возвращено ожидаемое значение.

Большая часть меня хочет удалить это, но я бы предпочел этого не делать, в надежде, что это поможет кому-то еще.

Этот пост — это то, что привело меня к ответу: https://community.idera.com/database-tools/powershell/ask_the_experts/f/learn_powershell-12/5412/tip—watch-out-return-values-from-functions-in-power-shell

Итак, две вещи, чтобы избежать искажения возвращаемых данных из функций

  1. Не забудьте удалить все строки, в которых вы ввели переменные, чтобы увидеть их значение

2. Не забывайте назначать выходные данные из вызовов функций в функции переменным

Как новичок powershell, я усвоил это на собственном горьком опыте