PowerShell equivalent van krul
Is er een equivalent van curl
in PowerShell? Heeft het een soortgelijk ingebouwd vermogen of is er een cmdlet van een derde partij?
Is er een equivalent van curl
in PowerShell? Heeft het een soortgelijk ingebouwd vermogen of is er een cmdlet van een derde partij?
PowerShell 3.0 heeft de nieuwe opdracht Invoke-RestMethod
:
http://technet.microsoft.com/en-us/library/hh849971.aspx
meer details: https://discoposse.com/2012/06/30/powershell-invoke-restmethod-putting-the-curl-in-your-shell/
Vanaf Powershell 5.0, zo niet eerder, curl
is een alias voor Invoke-WebRequest
.
PS> Get-Alias -Definition Invoke-WebRequest | Format-Table -AutoSize
CommandType Name Version Source
----------- ---- ------- ------
Alias curl -> Invoke-WebRequest
Alias iwr -> Invoke-WebRequest
Alias wget -> Invoke-WebRequest
Om het unaliased commando te gebruiken …
PS> Invoke-WebRequest -Uri https://localhost:443/
PS> Invoke-WebRequest -Uri https://www.google.com
Dus geef verschillende eigenschappen van het verzoek als volgt terug …
PS> Invoke-WebRequest -Uri https://www.google.com
StatusCode : 200
StatusDescription : OK
Content : <!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-AU"><head><meta content="text/html; charset=UTF-8"
http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/...
RawContent : HTTP/1.1 200 OK
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Vary: Accept-Encoding
… of alleen de inhoud …
PS> Invoke-WebRequest -Uri https://www.google.com | Select-Object -ExpandProperty Content
<!doctype html><html itemscope="" itemtype="http://schem[etc ...]
De equivalente aliased commando’s zijn …
PS> curl -Uri https://www.google.com
PS> curl -Uri https://www.google.com | Select-Object -ExpandProperty Content
Leveraging Powershell defaults en andere aliassen die je zou kunnen verkorten tot
PS> curl https://www.google.com
ps> curl https://www.google.com | Select -ExpandProperty Content
… maar ik zou het niet aanraden. Verbose commando’s helpen anderen bij het lezen van je code.
Update:
Vanaf Powershell 6.x “Core” curl
is geen alias meer voor Invoke-WebRequest
(de alias wget
is ook verwijderd) . Gebruik in plaats daarvan Invoke-WebRequest
direct.
PS> Get-Alias -Definition Invoke-WebRequest | Format-Table -AutoSize
CommandType Name Version Source
----------- ---- ------- ------
Alias iwr -> Invoke-WebRequest
Curl is niet langer een alias voor Invoke-WebRequest (getest op Powershell 6.2.3), ondanks een schijnbare afwijzing van een beweging in een RFC “om de aliassen krullen en wget te verwijderen uit Windows PowerShell” .
Dat RFC opmerkt “De wget/curl aliassen waren al verwijderd uit PowerShell Core, dus het probleem [van het hebben van die aliassen] was beperkt tot Windows PowerShell.”
In de conclusie moedigt het Powershell team ook gebruikers aan “om niet te vertrouwen op aliassen in scripts”.
Zoals @v6ak in het commentaar heeft opgemerkt kan het gebruik van curl
en wget
in PowerShell (5.0 of lager) een probleem zijn in: het onbedoeld aanroepen van de echte curl of wget als deze naast elkaar zijn geïnstalleerd; en, in ieder geval, verwarring veroorzaken.
Het wordt aanbevolen om Powershell “core” (6.x of hoger) te upgraden om te kunnen profiteren van de standaard codering utf8NoBOM
, bij gebruik van Invoke-WebRequest
(en vele andere tekstuitvoercommando’s). Indien men dit expliciet doet kan men iets doen als:
Invoke-WebRequest `
-Uri https://raw.githubusercontent.com/fancyapps/fancybox/master/dist/jquery.fancybox.min.js `
| Select-Object -ExpandProperty Content `
| Out-File jquery.fancybox.min.js `
-Encoding utf8NoBOM
Echter, zelfs wanneer men een korter, impliciet, commando gebruikt…
Invoke-WebRequest `
-Uri https://raw.githubusercontent.com/fancyapps/fancybox/master/dist/jquery.fancybox.min.js `
-OutFile jquery.fancybox.min.js
… wordt er gecodeerd met utf8NoBOM
(dit kan men bijvoorbeeld controleren door het opgeslagen bestand te openen in Visual Studio Code en “UTF-8” in de statusbalk te observeren).
Bestanden opgeslagen met utf8NoBOM
hebben de neiging om minder problemen te veroorzaken wanneer men door verschillende ecosystemen reist. Natuurlijk, als je een andere codering nodig hebt kun je een alternatief expliciet instellen.
In Powershell 5.0 en lager was de utf8NoBOM
codering niet beschikbaar, laat staan de standaard.
Details:
De uitstekende Command Line Kung Fu blog heeft een post waar ze krul, wget en de gerelateerde PowerShell commando’s
vergelijken In een notendop:
(New-Object System.Net.WebClient).DownloadString("http://www.example.com/hello-world.html","C:\hello-world.html")
Of, als uw versie van Powershell/.Net geen 2 parameters accepteert voor DownloadString
:
(New-Object System.Net.WebClient).DownloadString("http://www.example.com/hello-world.html") > "C:\hello-world.html"
U kunt ook Git voor Windows installeren en vervolgens de Git-bakmap in uw pad plaatsen. De Git-installatie omvat onder andere curl.exe. Zet %programfiles(x86)%\git\bin
na de installatie gewoon in uw PATH. Vervolgens kunt u het curl commando van de Windows Command Prompt of PowerShell console gebruiken.
U kunt installeert cURL met Chocolatey en heeft krullen beschikbaar in PowerShell CLI of cmd
.
Dit commando zou moeten werken:
Invoke-WebRequest -UseBasicParsing -Uri http://example.com/
Het maakt deel uit van Microsoft.PowerShell.Utility sinds PowerShell 3.0.
Zie ook: Haal $webclient.downloadstring om naar een tekstbestand te schrijven in Powershell .