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.

14
demandé sur Community 2016-04-05 17:15:05

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 %{...}.

16
répondu simonwo 2016-04-05 14:15:05