Dans PowerShell, irm est
l'alias de la commande Invoke-RestMethod.
Cette commande sert à envoyer des requêtes HTTP vers des API web (GET, POST, PUT, DELETE, etc.) et à récupérer automatiquement les données retournées.
Exemple simple
irm https://api.github.com/repos/PowerShell/PowerShell
PowerShell envoie une requête GET à l'URL et convertit automatiquement la réponse JSON en objet PowerShell.
Équivalent complet
Invoke-RestMethod https://api.github.com/repos/PowerShell/PowerShell
Cas d'usage courants
Récupérer des données d'une API :
$meteo = irm "https://wttr.in/Lugano?format=j1"
$meteo.current_condition
Envoyer des données (POST) :
$body = @{
name = "Test"
} | ConvertTo-Json
irm -Uri "https://example.com/api" `
-Method Post `
-Body $body `
-ContentType "application/json"
Différence avec iwr
irm(Invoke-RestMethod) : interprète automatiquement les réponses JSON ou XML et renvoie des objets PowerShell.iwr(Invoke-WebRequest) : renvoie davantage d'informations sur la requête/réponse HTTP et est souvent utilisé pour télécharger des fichiers ou analyser du contenu HTML.
Par exemple :
irm https://api.github.com/users/octocat
renvoie directement un objet avec des
propriétés comme login, id, etc., alors que :
iwr https://api.github.com/users/octocat
renvoie un objet de réponse HTTP contenant le contenu brut et les métadonnées de la requête.
Oui.
irm
(Invoke-RestMethod) effectue une
requête réseau vers l'URL que vous lui fournissez.Par exemple :
irm https://api.github.com
PowerShell se connecte à Internet (ou à un serveur interne si l'URL pointe vers votre réseau local) et récupère la réponse.
Quelques précisions :
- Si l'URL est publique (
https://...),irmutilise Internet. - Si l'URL est interne (
http://serveur-intranet/...), la requête reste sur votre réseau local. irmpeut également télécharger et exécuter du contenu si ce contenu est ensuite transmis à une autre commande.
Par exemple, cette commande souvent vue dans des scripts :
irm https://exemple.com/script.ps1 | iex
fait deux choses :
irmtélécharge le contenu du script depuis le site web.iex(Invoke-Expression) exécute immédiatement ce qui a été téléchargé.
C'est pourquoi les commandes
contenant irm (surtout lorsqu'elles
sont combinées avec iex) doivent
être examinées attentivement avant d'être exécutées.
Dans quel répertoire irm place ce qu'il a téléchargé ?
Par défaut, irm ne place rien
dans un répertoire.
Invoke-RestMethod télécharge la réponse en mémoire et la
renvoie directement à PowerShell sous forme d'objet ou de texte. Aucun fichier
n'est créé automatiquement.
Exemple :
$data = irm https://api.github.com/repos/PowerShell/PowerShell
Les données sont stockées dans la variable
$data, pas dans un fichier sur le
disque.
Pour enregistrer le contenu dans un fichier
Il faut le faire explicitement :
irm https://example.com/fichier.txt | Out-File .\fichier.txt
ou
(irm https://example.com/fichier.txt) > .\fichier.txt
Le fichier sera alors créé dans le répertoire
courant (celui indiqué par Get-Location).
Cas
particulier : irm ... |
iex
irm https://example.com/script.ps1 | iex
Ici, le script est téléchargé en mémoire
puis exécuté immédiatement. En principe, aucun fichier n'est enregistré sur le
disque par irm lui-même.
Si vous avez une commande précise contenant irm, je peux l'analyser et vous dire
exactement où vont les données et ce qu'elle fait.
Est-ce que « irm https://example.com/ | Out-File .\fichier.txt » fonctionne ?
Oui, cela fonctionne généralement, à condition que la réponse de l'URL soit du texte ou puisse être convertie en texte.
irm https://example.com/ | Out-File .\fichier.txt
Dans cet exemple :
irmtélécharge le contenu de la page.- PowerShell convertit le résultat en texte.
Out-Fileécrit ce texte dansfichier.txtdans le répertoire courant.
Pour une page HTML comme https://example.com/, le fichier contiendra le code HTML
de la page.
Attention aux API JSON
Si l'URL renvoie du JSON, irm le convertit automatiquement en objet
PowerShell. Dans ce cas, le résultat écrit par Out-File peut ne pas ressembler au JSON d'origine.
Par exemple :
irm https://api.github.com/users/octocat | Out-File .\user.txt
écrira une représentation textuelle de l'objet, pas forcément le JSON brut.
Si vous voulez conserver le JSON tel qu'il a été interprété, utilisez plutôt :
irm https://api.github.com/users/octocat |
ConvertTo-Json -Depth 10 |
Out-File .\user.json
Ou utilisez iwr (Invoke-WebRequest) et enregistrez directement le
contenu brut :
(iwr https://api.github.com/users/octocat).Content |
Out-File .\user.json
Donc la commande que vous proposez est valide, mais le résultat dépend du type de contenu renvoyé par l'URL.
Un JSON (JavaScript Object Notation) est un format texte très utilisé pour échanger des données entre applications, serveurs web et API.
Il représente des données sous forme de paires clé–valeur et de listes.
Exemple simple
{
"nom": "Alice",
"age": 30,
"ville": "Bellinzona"
}
Ici :
nom→"Alice"age→30ville→"Bellinzona"
Avec une liste
{
"nom": "Alice",
"langues": ["français", "italien", "anglais"]
}
Pourquoi est-il utilisé ?
Quand une API renvoie des données, elle les envoie souvent en JSON parce que :
- c'est lisible par les humains ;
- c'est facile à traiter par les programmes ;
- il est indépendant du langage de programmation.
Par exemple, une API météo pourrait renvoyer :
{
"temperature": 22,
"conditions": "ensoleillé"
}
Dans PowerShell
Si vous faites :
irm https://api.example.com/meteo
et que l'API renvoie le JSON ci-dessus, PowerShell le transforme automatiquement en objet :
$resultat.temperature
renverra :
22
C'est l'un des avantages de irm : il convertit automatiquement le
JSON en objets PowerShell faciles à utiliser.
Vous pouvez aussi convertir un objet PowerShell en JSON avec :
$obj = @{
nom = "Alice"
age = 30
}
$obj | ConvertTo-Json
Résultat :
{
"nom": "Alice",
"age": 30
}
En résumé, le JSON est simplement une façon standardisée de représenter des données structurées sous forme de texte.