2009-10-27 9 views
2

Je souhaite récupérer le contenu d'un fichier, le filtrer et le modifier, puis réécrire le résultat dans un fichier. Je fais ceci:Powershell: Sortie de l'objet [] vers un fichier

PS C:\code> "test1" >> test.txt 
PS C:\code> "test2" >> test.txt 
PS C:\code> $testContents = Get-Content test.txt 
PS C:\code> $newTestContents = $testContents | Select-Object {"abc -" + $_} 
PS C:\code> $newTestContents >> output.txt 

sortie.txt contient

"abc -" + $_                           
------------                           
abc -test1                            
abc -test2    

Ce qui donne à cette première ligne? C'est presque comme si foreach rendait IEnumerable - mais $ newTestContents.GetType() révèle qu'il s'agit d'un tableau d'objets. Alors qu'est-ce qui donne? Comment puis-je obtenir le tableau pour sortir normalement sans l'en-tête étrange.

points bonus Aussi, si vous pouvez me dire pourquoi newTestContents $ [0] .ToString() est une chaîne vide

Répondre

2

Utilisation ForEach au lieu de Select-Object

+0

comment pourrais-je utiliser exactement foreach pour créer une transformation? –

+0

George, .. utilise ton même code .. mais remplace Select-Object par ForEach. Cela devrait fonctionner comme sans aucune autre modification. – Nestor

+0

Ah, merci. Je pensais du point de vue C# LINQ où ForEach est un retour vide –

3

points de bonus aussi si vous pouvez me dire pourquoi $ newTestContents [0] .toString() est une chaîne vide

Si vous regardez son type, il est un exemple PSCustomObject

PS> $newTestContents[0].GetType().FullName 
System.Management.Automation.PSCustomObject 

Si vous regardez toString PSCustomObject() impl réflecteur vous voyez ceci:

public override string ToString() 
{ 
    return ""; 
} 

Pourquoi il le fait, je ne sais pas. Cependant, il est probablement préférable d'utiliser la contrainte de type chaîne dans PowerShell par exemple:

PS> [string]$newTestContents[0] 
@{"abc -" + $_=abc -test1} 

Peut-être que vous recherchez ce résultat si:

PS> $newTestContents | %{$_.{"abc -" + $_}} 
abc -test1 
abc -test2 

Cela démontre que lorsque vous utilisez Select-Object avec un simple scriptblock le contenu de ce scriptblock forme le nouveau nom de propriété sur le PSCustomObject qui est créé. En général, l'approche de Nestor est la voie à suivre, mais à l'avenir si vous avez besoin de synthensize propriétés comme celui-ci puis utilisez un Hashtable comme ceci:

PS> $newTestContents = $testContents | Select @{n='MyName';e={"abc -" + $_}} 
PS> $newTestContents 

MyName 
------ 
abc -test1 
abc -test2 


PS> $newTestContents[0].MyName 
abc -test1 
Questions connexes