【问题标题】:Powershell use pattern matching in filenamesPowershell 在文件名中使用模式匹配
【发布时间】:2021-02-05 09:55:25
【问题描述】:

我对 Powershell 不是很好,我面临一个简单的问题。我正在构建一个自动 Nuget 包发布脚本,为此我需要使用类似“Name.version.nupkg”的文件名推送 nuget 包。版本号发生了变化,所以我需要找到一个与更改版本号的模式相匹配的文件。

目前脚本是一个简单的脚本:

cd $PSScriptRoot
dotnet nuget push ..\bin\Debug\MacroFramework.*.nupgk --api-key --source https://api.nuget.org/v3/index.json

$PSScriptRoot 是“MacroFrameworkLibrary/Local”

输出是:

error: File does not exist (..\bin\Debug\MacroFramework.*.nupgk).

这里是目录内容的图片:

提前感谢您的帮助

编辑:最终的工作脚本如下:

cd $PSScriptRoot
$files = Get-ChildItem ..\bin\Debug\MacroFramework.*.nupkg | Sort-Object LastWriteTime -Descending | Select-Object -First 1

foreach ($pgk in $files)
{
  dotnet nuget push $pgk.FullName --api-key --source https://api.nuget.org/v3/index.json
}

【问题讨论】:

    标签: powershell


    【解决方案1】:

    dotnet nuget push 不支持路径中的通配符。

    您可以通过使用Get-ChildItem 中的通配符,按日期降序排序,然后将第一个匹配项传递给dotnet nuget push 来解决此问题。

    这是一个例子。 gci 是 Get-ChildItem 的别名,| 表示将其输出作为输入发送到下一个命令,% { } 是一个 for-each 循环。在循环内部,$_ 指的是当前项。

    cd $PSScriptRoot
    gci ..\bin\Debug\MacroFramework.*.nupkg | sort LastWriteTime -Descending | select -First 1 | % { dotnet nuget push $_.FullName --api-key --source https://api.nuget.org/v3/index.json }
    

    【讨论】:

    • 感谢您的回复。我从 & {} 更改为 foreach 循环。工作脚本在答案中。
    • @porras 很高兴它有帮助。我错过了你只想要最新的 nupkg。我添加了按日期降序排序并选择第一个结果到我的答案。这消除了对 break 的需要,并保证 for-each 中的第一项是最新的:$files = Get-ChildItem ..\bin\Debug\MacroFramework.*.nupkg | Sort-Object LastWriteTime -Descending | Select-Object -First 1
    • 谢谢,我也更新了原始问题的脚本。
    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2010-12-02
    相关资源
    最近更新 更多