Quel est l'équivalent de xargs en PowerShell?
POSIX-defined xargs
la commande prend tous les éléments qu'elle reçoit de l'entrée standard et les passe comme arguments de ligne de commande à la commande qu'elle reçoit sur sa propre ligne de commande. E. g: grep -rn "String" | xargs rm
.
Quel est l'équivalent en PowerShell?
Les questions suivantes demander ceci:
- Convertissez xargs Bash command en PowerShell?
- Qu'est-ce que L'équivalent PowerShell à cet ordre Bash?
mais il n'y a pas de bonne réponse, car toutes les réponses, soit utiliser ForEach-Object
, qui traitera les items un à la fois (comme xargs -n1
) qui obtient le résultat désiré pour les exemples donnés, ou stocker le résultat intermédiaire dans une variable, ce qui offense Ma Ligne de commande fonctionnelle-fu.
1 réponses
Il y a deux façons que j'ai trouvé. La première est probablement plus idiomatique PowerShell, et la seconde est plus fidèle à l'esprit dexargs
.
par exemple, disons que nous voulons passer toutes nos photos de chat à myapp.exe
.
Méthode n ° 1: la substitution de Commande
vous pouvez faire quelque chose de similaire à l'utilisation de $(substitution de commande) dans sh
en intégrant votre pipeline dans la chaîne de commande:
&"myapp.exe" @(Get-ChildItem -Recurse -Filter *.jpg | Another-Step)
@(...)
crée un tableau de commande à l'intérieur, et PowerShell étend automatiquement les tableaux passés à &
dans des paramètres de ligne de commande séparés.
cependant, cela ne répond pas vraiment à la question, car cela ne fonctionnera que si vous avez le contrôle sur la commande que vous voulez passer, ce qui n'est peut-être pas le cas.
Méthode #2: Vrai tuyauterie
vous pouvez aussi construire un "double pipeline" en ayant une sous-expression pour Piper vos objets, les collectionner dans un tableau, et ensuite raccorder le tableau à votre commande finale.
,@(Get-ChildItem -Recurse -Filter *.jpg | Another-Step) | %{&"myapp.exe" $_}
@(...)
comme avant collecte les éléments dans un tableau, et le tableau est alors pipé à la commande finale qui est invoquée en utilisant %
(ForEach-Object
). Normalement, cela boucle alors sur chaque élément individuellement, parce que PowerShell aplatira automatiquement le tableau quand il est pipé, mais cela peut être évité en préprogrammant le ,
opérateur. $_
la variable spéciale est alors utilisée comme normale pour intégrer le passé tableau.
Donc, la clé est d'envelopper le pipeline que vous souhaitez collecter ,@(...)
et puis la pipe que pour quelque chose dans %{...}
.