首页 > 解决方案 > Powershell 变量包含两次值

问题描述

我有一个从 jenskinsfile 启动的 powershell 脚本。这一切都很好。但在脚本中,我有一个下载文件的功能。这不起作用,因为$filePath变量包含该值两次。当这部分运行时,日志将如下所示:

https://example.com/api/download
D:\folder\file_2.txt D:\folder\file_2.txt

我如何才能获得仅存在于其中的价值$filePath

function DownloadFile ($folder, $version) {

    $wc = New-Object System.Net.WebClient
    $wc.Headers['Content-Type'] = 'application/json'

    $requesturl = "https://example.com/api/download"
    $filePath = Join-Path -Path $folder -ChildPath "\file_$version.txt"

    Write-Host "$requesturl"
    Write-Host "$filePath"

    $wc.DownloadFile($requesturl, $filePath)

    return $filePath
}

标签: powershell

解决方案


这意味着您传递给参数的-folder参数(在函数内部表示为$folder参数变量)是文件夹路径数组,而不是单个路径。

因此,解决方案是确保在调用函数时只传递一个文件夹路径DownloadFile例如:

DownloadFile -folder D:\folder -version 2

# With *positional* parameter binding:
DownloadFile D:\folder 2

由于Join-Path接受路径数组作为参数,因此在给定数组时-Path会输出多个路径;例如:

PS> $folder = 'c:\abc', 'c:\def'; Join-Path -Path $folder -ChildPath file.txt
c:\abc\file.txt
c:\def\file.txt

传递一个数组Write-Host隐式地对其进行字符串化,这意味着创建一个由空格连接的数组元素组成的单个字符串:

PS> $folder = 'c:\abc', 'c:\def'; Write-Host $folder
c:\abc c:\def

(请注意,这与隐式输出/输出 via 不同Write-Output,后者将每个数组元素打印在自己的行上;此外,隐式输出/Write-Output写入管道,这意味着它们输出数据以供以后处理,而Write-Host字符串写入显示器)。


推荐阅读