Ich möchte ein PowerShell-Skript schreiben, um das GitHub-Repo im ZIP-Format herunterzuladen, indem ich dieser Anweisung folge:
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"
Der Code hat die Zip-Datei heruntergeladen, aber ich habe diese Fehlermeldung erhalten, als ich versuchte, die Zip-Datei zu öffnen:
D:\MyRepo.zip
The archive is either in unknown format or damaged
Ich bin sehr neu in PowerShell, jede Hilfe ist willkommen!
Eventuell muss man genauer hinschauen download-a-repository-archive-zip Anweisungen. Es besagt, dass die Antwort eine 302-Weiterleitung zur URL zum Herunterladen enthält. Invoke-WebRequest
wird nicht automatisch umgeleitet, aber es werden die Antwortheader bereitgestellt.
Wenn Sie Ihre letzte Zeile ändern in:
$response = Invoke-WebRequest -Headers $Headers -Uri $Uri -Method Get
Sie können die Header des $response-Objekts überprüfen und ein weiteres ausgeben Invoke-WebRequest
mit denselben Headern und dem 302 Uri:
$RedirectedResponse = Invoke-WebRequest -Headers $Headers -Uri $RedirectedURI -Method Get
$RedirectedResponse.Content
enthält die verschlüsselten Dateiinhalte, die Sie decodieren und in Ihr lokales Dateisystem schreiben können.
BEARBEITEN: Ich bin zu einem System gekommen, auf dem ich Zugriff auf GitHub hatte, und habe das Skript getestet. Ich fand heraus, dass die erste Antwort ein Byte-Array mit dem Inhalt der ZIP-Datei enthielt. Diese Funktionalität ist zu nützlich, um sie nicht zu teilen! Hier ist ein Skript, das funktioniert, um ein Repo herunterzuladen:
$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
Out-File
würde eine Textdatei erstellen, keine Binärdatei.– Bill_Stewart
1. März 2021 um 19:54 Uhr