PowerShell从GitHub API下载Zip文件

3
我想编写一个PowerShell脚本,按照此指示下载以ZIP格式存储在GitHub上的repo: https://docs.github.com/en/rest/reference/repos#contents
$Token = 'MyUserName:MyPAT'
$Base64Token = [System.Convert]::ToBase64String([char[]]$Token)

$Headers = @{
    "Authorization" = 'Basic {0}' -f $Base64Token;
    "accept" = "application/vnd.github.v3+json"
    }

$Uri = "https://api.github.com/repos/{owner}/{repo}/zipball"
$r = Invoke-WebRequest -Headers $Headers -Uri $Uri -Method Get | Out-File "D:\MyRepo.zip"

代码确实下载了zip文件,但是当我尝试打开zip文件时,我收到了这个错误消息:
D:\MyRepo.zip
The archive is either in unknown format or damaged

我对PowerShell非常陌生,需要帮助!


1
"Out-File" 会创建一个文本文件,而不是二进制文件。 - Bill_Stewart
1个回答

4
你可能需要仔细查看下载存储库归档zip的说明。它说响应会有302重定向到下载URL。 Invoke-WebRequest不会自动重定向,但它会提供响应头。
如果您将最后一行更改为:
$response = Invoke-WebRequest -Headers $Headers -Uri $Uri -Method Get 

你可以查看 $response 对象的 Headers,并使用相同的 Headers 和 302 Uri 发起另一个 Invoke-WebRequest 请求。
$RedirectedResponse = Invoke-WebRequest -Headers $Headers -Uri $RedirectedURI -Method Get 

$RedirectedResponse.Content 将包含编码后的文件内容,您可以对其进行解码并写入本地文件系统。

编辑:我已经使用GitHub访问权限测试了脚本所在的系统。我发现第一个响应包含一个带有zip文件内容的字节数组。这个功能太有用了,必须分享!以下是可下载存储库的脚本:

$user = 'bjorkstromm'
$repo = 'depends'
$uri = "https://api.github.com/repos/$user/$repo/zipball/"
if(!$cred){$cred = Get-Credential -Message 'Provide GitHub credentials' -UserName $user}
$headers = @{
  "Authorization" = "Basic " + [convert]::ToBase64String([char[]] ($cred.GetNetworkCredential().UserName + ':' + $cred.GetNetworkCredential().Password)) 
  "Accept" = "application/vnd.github.v3+json"
}
$response = Invoke-WebRequest -Method Get -Headers $headers -Uri $uri
$filename = $response.headers['content-disposition'].Split('=')[1]

Set-Content -Path (join-path "$HOME\Desktop" $filename) -Encoding byte -Value $response.Content 

非常感谢,很抱歉我错过了指示的内容 :( - ITnewbie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接