Проблемы с блоком параметров в конвейере выпуска Azure Devops - PullRequest
0 голосов
/ 04 февраля 2019

Я пишу свой собственный скрипт Powershell для загрузки некоторых файлов через sFTP в конвейер выпуска Azure Devops.

Локально я сделал скрипт работающим, но заставить его работать в конвейере, как встроенный скрипт, не собираюсьтак хорошо.

Я создаю свой сценарий с параметрами по умолчанию, чтобы я мог проверить его локально с помощью ввода, но когда я выполняю его в Azure, я получаю сообщение об ошибке

param:Термин «param» не распознается как имя командлета, функции, файла сценария или работоспособной программы.Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.

Разрешено ли мне использовать param() в Azure?

param (
    $Localpath = $env:System_ArtifactsDirectory,
    $Remotepath = $env:sFTP_Remotepath,
    $Hostname = $env:sFTP_Host,
    $Username = $env:sFTP_Username,
    $Password = $env:sFTP_Password,    
    $HostKeyFingerprint = $env:sFTP_Hostkey,
    $WinSCPnetdllpath =  "$env:System_ArtifactsDirectory\WinSCPnet.dll"
)

try
{
    Write-Host "Hostname:" $Hostname
    Write-Host "Username:" $Username
    Write-Host "Password: ****"
    Write-Host "Remotepath:" $Remotepath
    Write-Host "Localpath:" $Localpath
    Write-Host "HostKeyFingerprint:" $HostKeyFingerprint
    Write-Host "WinSCPnetdllpath:" $WinSCPnetdllpath
    # Load WinSCP .NET assembly
    Add-Type -Path $WinSCPnetdllpath

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = [WinSCP.Protocol]::Sftp
        HostName = $Hostname
        UserName = $Username
        Password = $Password
        SshHostKeyFingerprint = $HostKeyFingerprint
    }

    $session = New-Object WinSCP.Session

    try
    {
        # Connect
        $session.Open($sessionOptions)

        # Upload files, collect results
        $transferResult = $session.PutFiles($Localpath, $Remotepath, $False)

        Write-Host ("Found {0} of files to upload" -f $transferResult.Transfers.Count)

        # Iterate over every transfer
        foreach ($transfer in $transferResult.Transfers)
        {
            # Success or error?
            if ($transfer.Error -eq $Null)
            {
                Write-Host (" - Upload of '{0}' .. Success" -f $transfer.FileName)                              
            }
            else
            {
                Write-Host (" - Upload of '{0}' .. Failed: {1}" -f $transfer.FileName, $transfer.Error.Message)
            }
        }
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
catch [Exception]
{
    Write-Host ("Error: {0}" -f $_.Exception.Message)
    exit 1
}

1 Ответ

0 голосов
/ 04 февраля 2019

Есть несколько операторов-оболочек, размещенных вокруг встроенных скриптов powershell, которые могут вызвать ошибки.Похоже, в настоящее время он не поддерживает блок param для встроенных вызовов.Вместо этого вы могли бы просто ссылаться на ваши параметры напрямую.

$ErrorActionPreference = 'stop'
...
if (!(Test-Path -LiteralPath variable:\LASTEXITCODE)) {
    Write-Host '##vso[task.debug]$LASTEXITCODE is not set.'
} else {
    Write-Host ('##vso[task.debug]$LASTEXITCODE: {0}' -f $LASTEXITCODE)
    exit $LASTEXITCODE
}

Существует некоторое обсуждение этого вопроса github .Вы также можете просмотреть код, так как он с открытым исходным кодом.

...