【问题标题】:Problems with param block in a Azure Devops release pipelineAzure Devops 发布管道中的参数块问题
【发布时间】:2019-02-04 12:59:15
【问题描述】:

我正在编写自己的 Powershell 脚本,以在 Azure Devops 发布管道中通过 sFTP 上传一些文件。

我在本地制作了脚本,但让它像内联脚本一样在管道中运行并不顺利。

我使用默认参数构建我的脚本,因此我可以使用输入在本地对其进行测试,但是当我在 Azure 中执行它时,我收到了错误消息

param : 术语“param”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,如果包含路径,请验证路径是否正确,然后重试。

我是否不允许在 Azure 中使用 param()

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
}

【问题讨论】:

  • 你是如何运行它的?什么任务?它是内联脚本还是来自源代码管理的文件?
  • 内联脚本powershell任务
  • 那一步的配置是什么样的?
  • 我添加了一个powershell步骤,选择inline后将脚本复制到窗口中

标签: powershell azure-devops azure-pipelines-release-pipeline


【解决方案1】:

在内联创建的 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 issue 上有一些关于它的讨论。你也可以浏览一下代码,因为它是开源的。

【讨论】:

  • 我将脚本添加到存储库而不是内联。现在可以正常使用了
猜你喜欢
  • 2019-08-04
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 2019-04-29
  • 2022-12-05
相关资源
最近更新 更多