2
votes

Comparez deux fichiers texte et écrivez les différences dans un fichier texte

Je veux comparer 2 fichiers texte et afficher la différence dans un autre fichier texte.

server05
server06

hostname_old.txt

InputObject   : server05
SideIndicator : <=

InputObject   : server06
SideIndicator : <=

hostname_new. txt

server04
server01
server02

Résultats

server02
server05
server04
server06
server01

Voici ce que je veux: (se débarrasser à la fois d'InputObject et de SideIndicator) p >

$Location = "c:\temp\z.txt"
compare-object (get-content c:\temp\hostname_old.txt) (get-content c:\temp\hostname_new.txt) | format-list | Out-File $Location

Remarque: Un problème connexe où un fichier d'entrée a des entrées en double fait l'objet de cette question .


0 commentaires

3 Réponses :


0
votes

Mise à jour : La réponse utile de Palle Due offre la meilleure solution.
Cette réponse peut encore être intéressante pour comparer l'énumération des membres avec l'utilisation du pipeline, une discussion sur le formatage de sortie et le contraste entre Out-File et Set-Content .


Dans PSv3 +, vous pouvez simplement utiliser énumération des membres pour extraire le .InputObject code> valeurs:

PS> (Compare-Object (Get-Content old.txt) (Get-Content new.txt)).InputObject
server05
server06

Remarque:

  • L'énumération des membres est pratique et rapide, mais au détriment de la consommation de mémoire, ce qui peut être un problème avec de très grandes collections (pas ici). La sortie de Compare-Object doit être collectée en mémoire dans son ensemble dans un tableau ( [object []] ), et, de même, les valeurs de la propriété .InputObject sont renvoyées sous forme de tableau.

  • Pour un streaming plus lent mais respectueux de la mémoire (traitement un par un), utilisez le pipeline avec Select-Object -ExpandProperty , comme dans La solution efficace de TobyU .

Re enregistrement dans un fichier : redirection vers Out-File $ location (ou, plus succinctement, en utilisant la redirection de sortie: > $ location ) est suffisant - pas besoin de Format-List.

En général, notez que le but des applets de commande Format- * est pour produire une sortie pour affichage , pas pour le traitement programmatique et la persistance.

Cela dit, Out-File / > code> utilise (effectivement) les applets de commande Format- * dans les coulisses pour produire une représentation sous forme de chaîne des objets d'entrée, tout comme la sortie de la console par défaut, c'est pourquoi ce n'est pas la bonne commande pour les objets d'entrée arbitraires persistants.

Utilisation de Out-File / > avec chaînes est sûr, cependant , car ils sont affichés tels quels. En revanche, les nombres pairs sont problématiques s'ils ont des décimales, car ils sont stringifiés avec le séparateur décimal de la culture actuelle (par exemple, , plutôt que . dans certaines cultures).

Si vos objets d'entrée sont des chaînes , vous pouvez également utiliser Set-Content , qui est plus rapide que Out-File code> / > , mais la mise en garde est que dans Windows PowerShell, le codage des caractères utilisé par défaut diffère: Out-File / > code > produit des fichiers UTF-16LE par défaut, alors que Set-Content utilise la page de codes "ANSI" de l'ancien système régional (généralement, un codage 8 bits à un octet tel que Windows-1252).
En revanche, dans PowerShell Core , les deux applets de commande produisent du UTF-8 sans nomenclature.

Notez que Set-Content , contrairement à Out-File , stringifie les objets non-string simplement en appelant la méthode .ToString () sur eux.


0 commentaires

0
votes

Je suppose que vous recherchez Select-Object -ExpandProperty InputObject

compare-object (get-content c:\temp\hostname_old.txt) (get-content c:\temp\hostname_new.txt) | Select-Object -ExpandProperty InputObject | Out-File $Location

Veuillez noter que vous ne pouvez pas utiliser format-list code > dans le Pipeline avant d'écrire des données dans un fichier.


1 commentaires

Solution solide. Notez que vous pouvez utiliser les applets de commande Format- * avec Out-File / > (mais pas avec Set-Content ). En fait, Out-File / > utilise (effectivement) les applets de commande Format- * en arrière-plan pour produire une représentation sous forme de chaîne des objets d'entrée . Cela dit, à moins que les objets d'entrée ne soient des chaînes, la représentation résultante convient uniquement à la consommation humaine et non en tant que format stable pour le traitement par programmation.



1
votes

1 commentaires

Cette solution ne se soucie pas des doublons. Chaque nouvelle ligne de texte est considérée comme unique. Ainsi, un duplicata dans le "nouveau" fichier sera copié vers l'extérieur, sauf s'il est également dupliqué dans "l'ancien" fichier.