Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
Kommentar vom Moderator Biber am 06.02.2012 um 21:40:32 Uhr
Nervigen Tippfehler im Titel berichtigt
GELÖST

Mehrere .txt mit Batch auslesen und verändern ?

Frage Entwicklung Batch & Shell

Mitglied: DaMoRph

DaMoRph (Level 1) - Jetzt verbinden

06.02.2012, aktualisiert 21:40 Uhr, 3905 Aufrufe, 16 Kommentare

Hallo zusammen,

ich möchte gerne eine Batch schreiben, habe aber feststellen müssen das meine Kenntnisse für diesen umfang nichtmehr ausreichen oder es mit einer Batch nicht evtl. garnicht geht...

Es geht darum dass ich in einen Ordner beliebige aber immer gleiche Art von Dateien kopiere für eine spätere Auswertung.

Diese Dateien haben einen nummerischen Namen Bsp. 101219246720.txt in dieser Datei gibt es ca. 27 Zeilen mit Alphanummerischen Werten,
wobei die ersten 3 die läge der Zeile angeben und nächsten 4 Ziffern immer angeben welcher wert dann kommt.

Ich möchte nun gerne mit dieser Batch bei allen Zeilen die ersten 3 Ziffern Löschen, die werden nicht benötigt.

Und dann alle Zeilen bis auf ca. 13 die dann mit den bestimmten Ziffer beginnen löschen.

Zudem gibt es in dem Ordner ca. 50 dieser txt. Immer andere nummerischer Name bei denen das passieren soll.

Ist das überhaupt mit einer Batch zu realisieren ?

Meine Idee war diese Werte mit Find zu suchen in eine neue Datei zu speichern, die alte zu löschen und diese neue dann in die alte umzubenennen aber ich scheiter da kläglich dran.

könnt ihr mir helfen?
Mitglied: pieh-ejdsch
06.02.2012 um 10:17 Uhr
moin DaMoRph,

also Ungetestet würde dies etwa so sein:

01.
@echo off &setlocal 
02.
set "Quelle=D:\Testordner" 
03.
set "Ziel=D:\Anderer Ordner" 
04.
 
05.
set "DateiFilter=[0-9]*.txt" 
06.
 
07.
set "ZeileLöschen=1234" 
08.
 
09.
pushD "%quelle%" 
10.
for /f "delims=" %%i in ('dir /b *.txt ^|findstr /r /b "%DateiFilter%"') do call :Files "%%i" 
11.
popD 
12.
goto :eof 
13.
:Files 
14.
15.
for /f "usebackq delims=" %%i in (%1) do (@set "Line=%%i" 
16.
  @setlocal enabledelayedexpansion 
17.
  @echo !Line:~3! 
18.
  @endlocal 
19.
20.
) | findstr /v /b "%ZeileLöschen%" > "%Ziel%\%~nx1"
[edit] popD nachgezogen [/edit]
[edit2 usebackq nachgezogen ... und in die Richtige Zeile gesteckt/edit]
EDIT funktioniert doch nicht, da delayed Ausdrücke in mit Klammern zusammengefassten Befehlszeilen als nichtdelayed Ausdrücke im Übergebenen Befehl nicht automatisch delayed ausgegeben werden.
/EDIT

Gruß Phil
Bitte warten ..
Mitglied: DaMoRph
06.02.2012 um 11:39 Uhr
Ui, das ging ja fix.
kannst du mir das evtl. noch in Stichpunkten erläutern ?
das währe super.
Bitte warten ..
Mitglied: pieh-ejdsch
06.02.2012 um 12:37 Uhr
hmmm, ich versuch es mal
also in

Zeile 2 und 3 bestimmst Du den Quellordner und den Zielordner.

In Zeile 5 bestimmt Du den Filter fürs Filtern der TXT Dateien (nur Ziffern vor der Dateiendung).

In Zeile 7 bestimmst Du den Filter fürs entfernen der Zeilen, weche ab dem 4. Zeichen diese Ziffern übereinstimmend enthalten.

In Zeile 9 wird in das Quellverzeichnis gewechselt.
In Zeile 10 werden alle TXT laut DateiFilter nacheinander dem Unterprogramm :Files als ersten Parameter Übergeben.

Nun SchauMaMal was das Unterprogramm macht:
In Zeile 14 sorgt die öffnende Klammer und die Schliessende Klammer von Zeile 20 für eine Gesamtausgabe der For Schleife.
In Zeile 15 bis 19 stelle ich fest die Option usebackq fehlt, um den Dateiinhalt abzuarbeiten
wird jede Zeile der übergebenen TXT ohne die ersten 3 Zeichen ausgegeben.
In Zeile 15 bis 18 sorgt das @ fürs ausblenden der Befehle, damit dem Findstr nur die reinen AusgabeZeilen übergeben werden.
In Zeile 20 werden die Zeilen nicht angezeigt, welche mit den Inhalt von ZeileLöschen beginnen und in eine TXT im Zeilordner eingefügt.

In Zeile 11 und 12 wird erst aus dem Quellverzeichnis wieder zurückgesprungen und anschliesend der Batch Beendet.

Gruß Phil
Bitte warten ..
Mitglied: DaMoRph
06.02.2012 um 15:04 Uhr
Vilen dank schon mal für die Mühe,

ich habe das jetzt ausprobiert, aber es will nicht.
Die Batch erzeugt keine txt in dem anderen Ordner.
Und ich denke ich brauche den filter für den Namen der txt nicht denn die Batch kann bzw. soll alle Dateien die in dem Ordner sind bearbeiten.
Frage: der Parameter der den Wert für die zu löschende Zeile enthält, wie kann ich da mehrere werte hinzufügen? Denn es sin ja mehrere Zeilen die zu löschen sind.


mfg S.Meister
Bitte warten ..
Mitglied: bastla
06.02.2012 um 16:10 Uhr
Hallo DaMoRph und willkommen im Forum!

Wenn Du keinen Dateifilter benötigst, könntest Du es mit der folgende Variante versuchen:
01.
@echo off & setlocal 
02.
set "Quelle=D:\Testordner" 
03.
set "Ziel=D:\Anderer Ordner" 
04.
 
05.
set "ZeileLöschen=...1234 ...0000" 
06.
 
07.
md "%Ziel%" 2>nul 
08.
pushD "%quelle%" 
09.
for /f "delims=" %%i in ('dir /b *.txt') do call :Files "%%i" 
10.
popD 
11.
goto :eof 
12.
:Files 
13.
14.
for /f "delims=" %%i in ('findstr /v /b "%ZeileLöschen%" %1') do ( 
15.
    set "Line=%%i" 
16.
    setlocal enabledelayedexpansion 
17.
    echo !Line:~3! 
18.
    endlocal 
19.
20.
)>"%Ziel%\%~nx1"
Hier werden alle Zeilen entfernt, welche ab der 4. Stelle (deswegen jeweils die 3 Punkte davor) die Werte 1234 oder 0000 enthalten ...

Grüße
bastla
Bitte warten ..
Mitglied: pieh-ejdsch
06.02.2012 um 19:11 Uhr
moin bastla,

Deine funktioniert sogar. Ich habe nicht getestet.
Ich dachte es geht - aber falsch gedacht. Abgesehen davon das das usebackq in der falschen For war und kein Zielverzeichnis erstellt wird wenn es fehlt.
Es wird nur der Text !Line:~3! in die TXT geschrieben.
Das kann ich mir nur so erklären, dass der Befehl in der Klammer immer ohne delayedexpansion mit den folgenden Verknüpft wird.
01.
set "line=abcde" 
02.
setlocal enabledelayedexpansion 
03.
(echo !line!)|findstr /n "^" 
04.
endlocal
Umleitungen klappen aber immer --- Komisch.
In Jebs Die Geheimnisse des Batch Zeilen Interpreters ist es nicht aufgeführt oder daraus abzuleiten.

Gruß Phil
Bitte warten ..
Mitglied: bastla
06.02.2012 um 19:25 Uhr
@PH
Deine funktioniert sogar.
Ja, ich war auch ganz erschrocken ...

Grüße
bastla
Bitte warten ..
Mitglied: rubberman
06.02.2012 um 20:57 Uhr
Hallo Phil,

auch dafür hatte jeb eine Erklärung, allerdings englisch ...
Why does delayed expansion fail when inside a piped block of code?
Stark vereinfacht: Beide Seiten der Pipe werden in ihrem eigenen Kommandozeilenkontext ausgeführt. Die verzögerte Variablenerweiterung wird dabei nicht vererbt. Ich hoffe, der verlinkte Thread trägt zum Verständnis bei.

Grüße
rubberman
Bitte warten ..
Mitglied: pieh-ejdsch
07.02.2012 um 00:53 Uhr
moin rubberman,

Wie lange läufst Du denn schon?

Ja ist einleutend mit dem Pipen aber
da kamma ja Improvisieren...
01.
setlocal 
02.
set "line=abcdexxx" 
03.
set "line2=12345xxx" 
04.
set "linea=xyz123abc" 
05.
 
06.
setlocal enabledelayedexpansion 
07.
08.
echo !line! 
09.
echo !line2! 
10.
echo !linea! 
11.
)|findstr /n "^" 
12.
 
13.
rem wenn das so nicht funktioniert dann bleibt ja als Variation fast nur das uebrig: 
14.
 
15.
>Line.cmd (@echo @setlocal enabledelayedexpansion&@echo @echo(^^!Line%%~1%%~2%%~3%%~4%%~5%%^^!) 
16.
 
17.
18.
line :~3 
19.
line : "~3,-3" 
20.
line 2 ":*5=" 
21.
line a : ~ 5 
22.
line a 
23.
)|sort|findstr /n "^" 
24.
 
25.
call line 2 ":*3=" 
26.
 
27.
pause
auch
ganz erschrocken ...
Gruß Phil
Bitte warten ..
Mitglied: rubberman
07.02.2012 um 01:06 Uhr
Hallo Phil.

Zitat von pieh-ejdsch:
Wie lange läufst Du denn schon?
Och, so ca. seit 40 Jahren (meistens mit nächtlichen Unterbrechungen)

Für kürzere Sequenzen kannst du auch direkt die cmd mit den entsprechenden Optionen aufrufen.
01.
set "line=abcde" 
02.
(cmd /q /v:on /c "echo(!line!")|findstr /n "^"
Mehrere Zeilen eben per & verknüpfen, fertig.
Natürlich ist das Ganze grottenlangsam, für jede Zeile einmal cmd und findstr als externe Tools zu laden. Allerdings habe ich jetzt auch nicht DIE Lösung parat. Ich denke bastlas Code ist da ziemlich nah am Optimum, da findstr auf die Datei, nicht aber auf jede einzelne Zeile angewendet wird.

Grüße
rubberman
Bitte warten ..
Mitglied: pieh-ejdsch
07.02.2012 um 09:29 Uhr
moin rubberman,
na da lauf ich ja erst ca 34 Jahre herum meinte ja Dein Bildchen
Natürlich ist das Ganze grottenlangsam ... bastlas Code ist da ziemlich nah am Optimum.
sehe ich auch so - daher habe ich ja ganz oben den Roten Merker eingügt (und den nicht so funtionierenden Code so stehen gelassen,und weil es hier vollkommen unproduktiv ist).

Wieder einen Grund mehr VBS anzuwenden bzw weiter zu lernen.

Gruß Phil
Bitte warten ..
Mitglied: bastla
07.02.2012 um 10:33 Uhr
Hallo PH und rubberman!
Wieder einen Grund mehr VBS anzuwenden
Ich hab das mal als Auftrag verstanden :
01.
Quelle = "D:\Testordner" 
02.
Ziel = "D:\Anderer Ordner" 
03.
 
04.
Muster = "#1234#0000#8765#" 'weitere Suchbegriffe zum Entfernen von Zeilen hier - mit # begrenzt - hinzufügen 
05.
Entfernen = 3 'Zeichenanzahl, die am Zeilenanfang entfernt werden soll 
06.
Testen = 4 'Zeichenanzahl, die am Anfang der neuen Zeile geprüft werden soll 
07.
 
08.
Set fso = CreateObject("Scripting.FileSystemObject") 
09.
If Not fso.FolderExists(Ziel) Then fso.CreateFolder(Ziel) 
10.
 
11.
For Each File In fso.GetFolder(Quelle).Files 
12.
    TextAlt = Split(File.OpenAsTextStream.ReadAll, vbCrLf) 
13.
    TextNeu = "" 
14.
    For Each Line In TextAlt 
15.
        If InStr(Muster, "#" & Mid(Line, Entfernen + 1, Testen) & "#") = 0 Then 
16.
            TextNeu = TextNeu & vbCrLf & Mid(Line, Entfernen + 1) 
17.
        End If 
18.
    Next 
19.
 
20.
    'Die ersten beiden Zeichen in "TextNeu" stellen eine Zeilenschaltung dar und 
21.
    '  werden deshalb bei der Ausgabe übersprungen. 
22.
    fso.CreateTextFile(Ziel & "\" & File.Name).Write Mid(TextNeu, 3) 
23.
Next
Grüße
bastla
Bitte warten ..
Mitglied: DaMoRph
07.02.2012 um 15:05 Uhr
Hi zusammen,
ich bin eben erst wieder dazu gekommen es zu testen, ...und esl läuft super :D
Ich danke euch viel mals dafür.
Ich werde administrator.de gleich mal meinen Kollegen weiterempfehlen!

Aber eine Frage oder bitte habe ich noch, im Momment löschen wir das was Find findet.
Ist es auch umgekehrt möglich das wir alles aus der Datei löschen, bis auf die zeilen mit den bestimmten ziffern an stelle 4-7 ?

mfg S.Meister
Bitte warten ..
Mitglied: pieh-ejdsch
07.02.2012 um 15:54 Uhr
moin DaMoRph,

natürlich - die Option /Vertausche Gefundenes mit Nicht gefundenem Ergebnis Weglassen.
die CMD-Hilfe help findstr gibt Dir immer Antworten.

Gruß Phil
Bitte warten ..
Mitglied: bastla
07.02.2012 um 16:00 Uhr
... und im VBScript wäre die Zeile 15 auf
If InStr(Muster, "#" & Mid(Line, Entfernen + 1, Testen) & "#") <> 0 Then
zu ändern ...

Grüße
bastla
Bitte warten ..
Mitglied: DaMoRph
07.02.2012 um 16:01 Uhr
Hi,
ja super läuft, hätte aber eben nicht gedacht das ich nur den Parameter weg lassen muss


Vielen dank euch noch mal

mfg S.Meister
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Mit Batch .txt auslesen und benutzen
gelöst Frage von GhostJumperHDBatch & Shell8 Kommentare

Ich habe folgendes Problem Ich möchte das W-Lan überlasten und möchte danach die .bat zur .exe umwandeln. Ich möchte ...

Batch & Shell
Mit Batch gesamtes txt auslesen mit Leerzeichen?
Frage von DrMarksmanBatch & Shell2 Kommentare

Guten Tag. Ich habe mal wieder eine Frage und zwar würde ich gerne einen kompletten .txt File mit einem ...

Batch & Shell
In Batch mehrere Zeilen auslesen ?!?
gelöst Frage von JanInfoHDBatch & Shell2 Kommentare

Ich habe in Programm in Batch geschrieben, doch es ließt aus einer .txt-Datei immer nur die erste Zeile, Was ...

Batch & Shell
BATCH Txt datei mit mehreren Computernamen auslesen und Daten wie (Namen und Letzte Startzeit auslesen) und in Txt schreiben
gelöst Frage von ITFloriBatch & Shell1 Kommentar

Hallo zusammen, wir müssen bis morgen ein Script schreiben, welches die ganzen Computernamen aus einer Textdatei ausliest und diese ...

Neue Wissensbeiträge
Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 2 StundenInternet2 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 6 StundenDSL, VDSL1 Kommentar

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Windows 10

Microsoft bestätigt DMA-Policy-Problem in Win10 v1709

Information von DerWoWusste vor 6 StundenWindows 10

Wer sein Gerät mit der DMA-Policy absichert, bekommt evtl. Hardwareprobleme in v1709 von Win10. Warum? Weil v1709 endlich "richtig" ...

Verschlüsselung & Zertifikate

Die Hölle friert ein weiteres Stück zu: Microsoft integriert OpenSSH in Windows

Information von ticuta1 vor 10 StundenVerschlüsselung & Zertifikate

Interessant Die Hölle friert ein weiteres Stück zu: Microsoft integriert OpenSSH in Windows SSH-Kommando in CMD.exe und PowerShell

Heiß diskutierte Inhalte
Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement21 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Windows Server
RODC kann nicht aus Domäne entfernt werden
Frage von NilsvLehnWindows Server19 Kommentare

HAllo, ich arbeite in einem Universitätsnetzwerk mit 3 Standorten. Die Standorte haben alle ein ESXi Cluster und auf diesen ...

Hardware
Kein Bild mit nur einer bestimmten Grafikkarten - Mainboard Konfiguration
gelöst Frage von bestelittHardware18 Kommentare

Hallo zusammen, ich hatte schon einmal eine ähnliche Frage gestellt. Damals hatte ich genau das gleiche Problem. Allerdings lies ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...