2016-05-16 9 views
2

Ich habe die alten Posts durchsucht, aber ich kann die sehr spezifische Antwort nicht finden, wie man den Leerraum im String ersetzt und ihn dann als Array verwendet.Entfernen von Leerzeichen aus der Zeichenfolgelinie und Verwendung in einem Array

Die Eingabedatei besteht die Zeilen:

-rw-r--r-- 1 myuser admin 315279199 May 12 02:46 2016_05_12_backup.tar.gz 
-rw-r--r-- 1 myuser admin 315278122 May 13 04:56 2016_05_13_backup.tar.gz 

ich die folgende Ausgabe erhalten möchten:

program executed on 2016-05-16/12:18:06 
to unix: 
rm -fr 2016_05_12_backup.tar.gz 
rm -fr 2016_05_13_backup.tar.gz 


to excel log: 
2016_05_12_backup.tar.gz 
2016_05_13_backup.tar.gz 

=============== END ============== 

Mein Code ist hier:

$path_in = "C:\test\input.txt" 
$path_out = "C:\test\output.txt" 

$endMessage = "=============== END ==============" 

$reader = [System.IO.File]::OpenText($path_in) 
$get_time_message = "program executed on " + [datetime]::now.ToString('yyyy-MM-dd/HH:mm:ss') 

try { 

add-content $path_out $get_time_message 
add-content $path_out "to unix: " 

$long_string_to_excel ="" 


    while($true){ 
     $line = $reader.ReadLine() 

     if ($line -eq $null) { break } 

     # divide the input line into array - remove white space 
     # it is hard coded here below for the lines that consist two and three space characters 

     $better_line = $line.replace(' ',' ') 
     $best_line = $better_line.replace(' ',' ').split(' ') 

     $stringToOutput = "rm -fr " + $best_line[8] 

     $long_string_to_excel = $long_string_to_excel + $best_line[8] + "`r`n" 

     add-content $path_out $stringToOutput 

    } 

    add-content $path_out "`n" 
    add-content $path_out "to excel log: " 
    add-content $path_out $long_string_to_excel 
    add-content $path_out $endMessage 

} 
finally { 
    $reader.Close() 
} 
write-host "program execution:`ncompleted" 

Dieses Skript funktioniert ok, aber es ist "hart" für die Eingabezeilen codiert, die aus zwei und drei Leerzeichen bestehen. Ich wollte

$better_line = $line.replace(' +', ' '); 
    $best_line = $better_line.split(' ') 

statt

$better_line = $line.replace(' ',' ') 
    $best_line = $better_line.replace(' ',' ').split(' ') 

aber die Ergebnisse sind verwenden, falsch:

program executed on 2016-05-16/12:18:04 
to unix: 
rm -fr 315279199 
rm -fr 315278122 


to excel log: 
315279199 
315278122 

=============== END ============== 

Könnten Sie bitte beraten bei der Lösung wie den hart codierten Teil so das Skript ersetzen funktioniert für jede Art von Leerraum in der einzelnen Zeile?

Antwort

4

Anstelle der statischen String.Split() Methode verwenden die eingebauten -split operator - es reguläre Ausdrücke unterstützt, so dass Sie es verwenden können, um „1 oder mehr Räume“ zum Beispiel zu spalten:

PS C:\> "a b" -split '\s+' 
a 
b 
PS C:\> "a b" -split '\s+' 
a 
b 
+0

Vielen Dank! Das Skript funktioniert jetzt einwandfrei. – paul543

2

How-to leere Elemente entfernen von Array in Powershell:

Intuitive Ansatz: jedes Element in Array überprüfen und überprüfen, ob es

$best_line = $line.split(' ') | ? {$_} 
leer ist oder nicht

Discursive (NET) Ansatz: String.Split Method (String[], StringSplitOptions)

$best_line = $line.split(' ',[System.StringSplitOptions]::RemoveEmptyEntries) 

Typ: System.StringSplitOptions

  • StringSplitOptions.RemoveEmptyEntries leere Feldelemente aus der Anordnung wegzulassen zurückgegeben; oder
  • StringSplitOptions.None, um leere Array-Elemente in das zurückgegebene Array aufzunehmen.
+0

Danke für die Antwort. Ich werde System.StringSplitOptions überprüfen. – paul543