Ich habe ein Skript für Windows Powershell erstellt und es als .ps1-Datei gespeichert. Ich habe es wie folgt erstellt:
$linecount = 0 $editfilenumber = 1 $endfilenumber = 1 $totallines = 0 $i = 0 $interval = 100 / 1
Dieser Teil dient nur zum Zurücksetzen aller grundlegenden Variablen. $linecount
wird für die Anzahl der Zeilen verwendet, die in den neuen Teilen erstellt werden (sprechen Sie später darüber). $editfilenumber
wird für die Dateinummer verwendet, die bearbeitet wird (Duplikate entfernt, Invaliden entfernt ...). $endfilenumber
wird für die Teilenummer verwendet, die erstellt wurde. $totallines
wird für die Gesamtzahl der Zeilen verwendet. $i
wird zur Berechnung der Prozentsätze verwendet. $interval
wird für das Aktualisierungsintervall des Fortschrittsbalkens verwendet (sonst wäre der Prozess sehr langsam)
$srcdirectory = Read-host "Select path to the source folder" $partdirectory = Read-host "Select path to where the parts need to be stored" $maxlines = Read-host "How many lines are in the new parts?" $maxsize = [int]$maxlines $partname = Read-host "How do you want the new parts to be called?"
Dies fordert den Benutzer grundsätzlich nach den Daten und nach der Anzahl der Zeilen in den Teilen.
$files = Get-ChildItem $srcdirectory -filter *.txt Write-Host "These files will be edited and combined: " $files | format-table name
Dadurch werden alle TXT-Dateien im angegebenen Verzeichnis aufgelistet. Auf diese Weise wird dem Benutzer mitgeteilt, welche Dateien verwendet werden.
Write-Host "Press any key to continue..." -foregroundcolor "green" $HOST.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | OUT-NULL $HOST.UI.RawUI.Flushinputbuffer()
Dies wartet auf die Bestätigung des Benutzers, indem auf das Drücken einer Taste gewartet wird.
$start = Get-Date
Dadurch wird der aktuelle Zeitstempel zum Berechnen der Bearbeitungszeit am Ende abgerufen.
ForEach ($file in $files) { Write-host "Editing file: " $file Write-host "Loading list..." $list = Get-content $srcdirectory\$file Write-host "OK" -foregroundcolor "green" Write-host "Removing duplicates..." $list = $list | Get-Unique Write-host "OK" -foregroundcolor "green" Write-host "Removing invalid..." $list = $list | Where { $_ -notmatch "^@" } | Where { $_ -match "@" } $list = $list -replace ';', ':' | Where {$_ -notmatch ':[^\)]+:'} | Where {$_ -notmatch '::'} Write-host "OK" -foregroundcolor "green" Write-host "Combining lists..." $longlist = $longlist + $list | Get-Unique $editfilenumber ++ Write-host "Success!" -foregroundcolor "green" }
Dieser Teil ist sehr wichtig. Zuerst wird angezeigt, welche Datei bearbeitet wird, und $list
der Inhalt dieser Datei wird erstellt. Danach wird es alle einzigartigen Linien (und damit das Entfernen von Duplikaten) bekommt, ungültige Zeilen entfernen (müssen für die Zwecke des Programms festgelegt werden) und fügt schließlich das gefilterte $list
zu $longlist
. Dies erfolgt für jede Datei und somit wird jede gefilterte Datei hinzugefügt $longlist
.
Write-Host "Removing all duplicates..." $longlist = $longlist | Get-Unique Write-Host "Success!" -foregroundcolor "green"
Dadurch werden alle Duplikate entfernt $longlist
.
Write-host "Calculating total number of lines..." $longlist | % { $totallines += $_.count } Write-host "There are a total of " $totallines " unique and valid lines." - foregroundcolor "green"
Dadurch wird die Gesamtzahl der eindeutigen gültigen Zeilen berechnet. Dies ist für die Benutzerinformationen und wird verwendet, um den Fortschritt in der Fortschrittsleiste zu berechnen.
Write-host "Creating parts..." $longlist | ForEach { Add-Content $partdirectory/$partname.$endfilenumber.txt "$_" $linecount++ $i++ If ($linecount -eq $maxsize) { Write-host "Success! " $partname$endfilenumber " created" -foregroundcolor "green" $endfilenumber++ $linecount = 0 } If ($i % $interval -eq 0) { $percent = ($i / $totallines) * 100 $percent = [math]::Round($percent,2) Write-Progress -Activity "Creating parts" -Status $percent -PercentComplete $percent } }
Dies ist der wichtigste Teil. Es erstellt eine Datei mit dem angegebenen Dateinamen im angegebenen Verzeichnis. Sie fügt dieser Datei eine Zeile $ longlist hinzu. Dann erhöht es sich $linecount
und $i
mit 1. Wenn $linecount
dann der angegebenen maximalen Dateigröße entspricht, wird es um $endfilecount
1 erhöht . Andernfalls wird die nächste Zeile zur vorhandenen Datei hinzugefügt.
Die angegebene Dateigröße beträgt beispielsweise 10.000 Zeilen und der Teilname lautet Part$endfilenumber
. Die erste Zeile von $longlist
wird der Datei Part1.txt hinzugefügt ( $endfilenumber = 1
wie in der ersten Codezeile angegeben). Wenn die Zeile 10.00 hinzugefügt wird, wird die If
Anweisung verwendet. Das bedeutet, dass die Anzahl $endfilenumber
um 1 erhöht wird. Auf diese Weise wird die nächste Zeile $longlist
zu einer neuen Datei mit dem Namen Part2.txt (weil $endfilenumber = 2
) hinzugefügt .
Die zweite if -Anweisung wird zur Berechnung des Fortschritts verwendet. Das ist nicht sehr wichtig. Um Zeit zu sparen, werde ich das nicht erklären.
$end = Get-Date $time = ($end-$start).TotalMinutes $time = [math]::Round($time,2) Write-host "A total of " $endfilenumber " parts have been created" - foregroundcolor "green" Write-host "Total processing time: " $time " minutes" -foregroundcolor "green" Write-Host "Press any key to exit..." -foregroundcolor "green" $HOST.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | OUT-NULL $HOST.UI.RawUI.Flushinputbuffer()
Dies ist der letzte Teil des Codes. Dies nimmt den Zeitstempel und subtrahiert ihn vom Zeitstempel am Anfang. Auf diese Weise wird die Verarbeitungszeit in Minuten berechnet und auf 2 Dezimalstellen gerundet. Das letzte Bit wartet nur darauf, dass der Benutzer das Programm beendet und beendet.
Ich habe gehofft, das hilft ein bisschen.
HINWEIS: Dieses Programm wirkt sich NICHT auf die Originaldateien aus! Also das ist schön, schätze ich ...