2010-11-23 37 views
2

Lorsque vous utilisez set-content Set-Content C:\test.txt "test","test1" par défaut, les deux chaînes fournies sont séparées par une nouvelle ligne, mais il y a également une nouvelle ligne à la fin du fichier. Comment ignorer cette nouvelle ligne ou nouvelle ligne avec des espaces lors de l'utilisation de Get-Content?powershell get-content ignore newline

Répondre

1

Vous pouvez supprimer la ligne vide comme ceci:

Set-Content C:\test.txt "test",'',"test1" 
Get-Content c:\test.txt | ? { $_ } 

Cependant, il supprime la chaîne au milieu aussi bien.
Editer: En fait, comme j'ai essayé l'exemple, j'ai remarqué que Get-Content ignore la dernière ligne vide ajoutée par Set-Content.

Je pense que votre problème est dans Set-Content. Si vous utilisez avec solution de contournement WriteAllText, il fonctionne très bien:

[io.file]::WriteAllText('c:\test.txt', ("test",'',"test1" -join "`n")) 

Vous passez une chaîne en tant que second paramètre. C'est pourquoi j'ai d'abord rejoint les chaînes via -join puis l'ai passé à la méthode.

Remarque: ce n'est pas recommandé pour les fichiers volumineux, en raison de la concaténation de chaînes qui n'est pas efficace.

+0

La méthode [' WriteAllLines'] (http://msdn.microsoft.com/en-us/library/system.io.file.writealllines.aspx) travaux avec des collections, évitant le besoin de «joindre» le tableau en une seule chaîne: '[IO.File] :: WriteAllLines ('c: \ test.txt', (" test ", ''," Test1 ")) ' –

0

C'est un comportement par défaut que Set-Content ajoute une nouvelle ligne car il permet de définir un contenu avec des tableaux de chaînes et de les obtenir un par ligne. Quoi qu'il en soit, Get-Content ignore la dernière "nouvelle ligne" (s'il n'y a pas d'espace derrière). travail autour de Set-Content:

([byte[]][char[]] "test"), ([byte]13), ([byte]10) ,([byte[]][char[]] "test1") | 
    Set-Content c:\test.txt -Encoding Byte 

ou utiliser beaucoup plus simple [io.file] :: WriteAllText

peut vous indiquer la situation exacte (ou code)?

par exemple si vous voulez ignorer la dernière ligne lors de l'obtention du contenu, il ressemblerait à ceci:

$content = Get-Content c:\test.txt 
$length = ($content | measure).Count 
$content = $content | Select-Object -first ($length - 1) 

mais si vous faites juste:

"test","test1" | Set-Content C:\test.txt 
$content = Get-Content C:\test.txt 

la variable $ content contient deux éléments: "test », "test1"

0
Get-Content C:\test.txt | Where-Object {$_ -match '\S'}