Hier 2 Lösungen in Powershell - das geht in jedem aktuellen Windows und ist deutlich flotter und schöner als Batch
Lösung 1 ist etwas simpler:
[src=powershell](Select-String -Path C:\uniqpass.txt -Pattern '.{8,15}').Line | Set-Content -Path c:\out.txt[/src]
Diese Lösung benötigt für ~2Mio Passwörter (ca. 20mb) 55 Sekunden
Lösung 2 ist leicht umfangreicher aber schneller:
[src=powershell]$out = New-Object System.Collections.Generic.List[System.Object]
foreach ($line in [System.IO.File]::ReadAllLines('C:\uniqpass.txt')) {
if ($line -match '.{8,15}') {$out.Add($line)}
}
Set-Content -Value $out.ToArray() -Path c:\out2.txt[/src]
25 Sekunden - also etwas unter der hälfte. Liegt vor allem an der Referenz auf die .NET Funktion zum lesen der Datei.
Beide Scripte kannst du in eine .ps1 speichern, Pfade anpassen und rechtsklick > ausführen als Powershell.
Dabei musst du im Standard eine Nachfrage bestätigen die nur verhindert das man ein solches Script nicht ausversehen ausführt.
Wenn du diese Sicherung ausschalten möchtest dann geht das indem du die powershell-console auf machst (Windows-Taste + R > powershell.exe) und dort "set-executionpolicy unrestricted" eingibst und den Anweisungen folgst.
Edit:
Habe noch eine
Lösung 3 als Batch von einer guten Seele schreiben lassen... Laufzeit 25 Minuten

[src=bash]@echo off
SetLocal ENABLEDELAYEDEXPANSION
del out.txt >nul: 2>&1
For /f %%a in (uniqpass.txt) do @(
Set _X1=&Set _X2=
Set _x1=%%a
if not "!_x1:~7,1!" == "" Set _x2=!_x1!
if "!_x2:~15,1!" == "" Echo !_x2! >> out.txt
)[/src]