Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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
GELÖST

Fortlaufende variable in batch möglich?

Frage Entwicklung Batch & Shell

Mitglied: Knoepel

Knoepel (Level 1) - Jetzt verbinden

08.06.2011 um 11:49 Uhr, 5326 Aufrufe, 8 Kommentare

Hallo!

Folgende Situation:
Ich habe eine txt datei die nenn ich mal frosch0001.txt
Der Inhalt ist z.B:

Text
Text
Text
0001
Text

Jetzt möchte ich per batch die Zeile 0001 in eine fortlaufende Nummer ändern z.B. Bis 9999 und diese dann jedesmal in eine neue Datei ausgeben (frosch0001,frosch0002,...frosch9999).
Ich habe Bereits Lösungen gefunden, wie das zum erstellen einer Datei funktioniert. Aber noch nicht, wie man 9999 mit der passenden Änderung ausgibt.
Mitglied: Friemler
08.06.2011 um 12:46 Uhr
Hallo Knoepel,

Deine Frage ist etwas schwer verständlich formuliert. Du willst also aus einer Datei 9999 Kopien erzeugen, die sich nur im Inhalt dieser einen Zeile und im Namen unterscheiden. Richtig soweit?

Ist 0001 denn wirklich der ganze Inhalt der Zeile? Das steht auch immer am Zeilenanfang? Gibt es in der Datei nur diese eine Zeile, die so oder nach dem gleichen Muster beginnt? Ist das immer (so wie im Beispiel) die 4. Zeile in der Datei? Können in der Datei Zeichen wie %, &, <, >, |, " oder ! vorkommen (das sind für Batchscripte Problemzeichen)?

Du musst schon etwas mehr Informationen liefern.

Gruß
Friemler
Bitte warten ..
Mitglied: Knoepel
08.06.2011 um 13:00 Uhr
Ja, du hast das mit den 9999 Kopien richtig erkannt

Die 0001 steht immer so am Zeilenanfang ich könnte sie auch zum besseren wiederfinden in der Grundversion xxxx nennen damit es eine eindeutigkeit gibt.

Es nicht immer die vierte Zeile, diese variiert. Also muss die Zeile ausfindig gemacht werden.

Die von dir genannten Sonderzeichen sind nicht vorhanden. Nur ein paar : und ;
Bitte warten ..
Mitglied: Friemler
08.06.2011 um 14:11 Uhr
Hallo Knoepel,

probiere mal das hier:
01.
@echo off 
02.
 
03.
setlocal 
04.
 
05.
 
06.
set "SrcFileName=%~dpn1" 
07.
set "SrcFileExt=%~x1" 
08.
 
09.
set "nCopies=10" 
10.
set "nDigits=4" 
11.
set "NumberMarker=xxxx" 
12.
 
13.
 
14.
for /l %%i in (1,1,%nCopies%) do ( 
15.
  for /f "eol=: tokens=1,* delims=:" %%k in ('findstr /n "^" "%SrcFileName%%SrcFileExt%"') do ( 
16.
    call :ProcessLine %%i 
17.
18.
19.
 
20.
exit /b 
21.
 
22.
 
23.
 
24.
:ProcessLine 
25.
  set "Number=0000000000%~1" 
26.
  call set "Number=%%Number:~-%nDigits%%%" 
27.
 
28.
  (for /f "delims=" %%d in ("DummyString") do ( 
29.
     echo\%%l|findstr /b /c:"%NumberMarker%" > NUL && ( 
30.
       echo %Number% 
31.
     ) || ( 
32.
       echo\%%l 
33.
34.
  )) >>"%SrcFileName%%Number%%SrcFileExt%" 2>NUL 
35.
exit /b
Das Icon der Ausgangsdatei mit der Maus auf das Icon des Batchfiles ziehen.

Die erzeugten Nummern fangen immer bei 0001 an. Den Endwert kannst Du über die Variable nCopies in Zeile 9 festlegen. Die Anzahl Stellen der erzeugten Zahl wird in Zeile 10 (hier 4) festgelegt. Die Kennung für die Zeile der Ausgangsdatei, in der in den Ausgabedateien die Zahl stehen soll, wird in Zeile 11 festgelegt.

Der Code ist etwas kompliziert, um evtl. doch vorhandene Sonderzeichen in der Ausgangsdatei fehlerfrei in die Zieldateien schreiben zu können.

Für Informationen zur FOR-Schleife bitte mein Tutorial zur FOR-Schleife durcharbeiten! In diesem Kommentar zum Tutorial von jeb-the-batcher ist die Erklärung für die FOR-Schleife im Unterprogramm mit DummyString zu finden.

Gruß
Friemler


[EDIT]
Das Script schreibt jetzt auch Leerzeilen in die Zieldateien.
[/EDIT]
Bitte warten ..
Mitglied: Knoepel
08.06.2011 um 18:19 Uhr
erstmal vielen Dank für deine Mühe!

Aber hast du das schon mal selbst getestet?
Ich finde den Prozess extrem langsam.
Hab hier nen 2x 1,6Ghz Rechner und der braucht pro Datei locker 30 Sek. Und bei 5000 Dateien.. oha...
Wie kommt das zustande?

Hab gerade noch was gefunden.
Wenn in der Datei Leerzeilen sind, werden die nicht mitkopiert. damit wird die Datei unbrauchbar.
Bitte warten ..
Mitglied: Friemler
08.06.2011 um 18:40 Uhr
Hallo Knoepel,

Batchscript ist kein Meister der Geschwindigkeit. Das Unterprogramm muss für jede Zeile jeder Datei aufgerufen werden, allein der Aufruf kostet schon Zeit und bei großen Dateien summiert sich das. Ich habe auf einem Intel Core i5 760 @ 4x2,8 GHz mit einer 5-Zeilen-Datei getestet, jede Zeile max. 10 Zeichen und davon 10 Kopien angelegt.

Nun ja, bei 30 Sekunden pro Datei würde das Script für 5000 Dateien knapp 2 Tage laufen . Da hilft dann wohl nur, das ganze in VBScript zu schreiben. Wenn ich zwischendurch noch Zeit finde, setze ich mich nochmal da ran.

Du hättest aber auch gleich erwähnen können, dass Du große Datenmengen verarbeiten willst...

...und von Leerzeilen war auch nicht die Rede.

Gruß
Friemler
Bitte warten ..
Mitglied: Friemler
08.06.2011 um 20:33 Uhr
Hallo Knoepel,

hier dann mal die VBScript-Version, die Deine Ansprüche an die Geschwindigkeit hoffentlich erfüllt. Die Bedienung erfolgt so, wie bei dem Batchscript.
01.
Const nCopies      = 10 
02.
Const nDigits      = 4 
03.
Const NumberMarker = "xxxx" 
04.
 
05.
 
06.
Const ForReading = 1 
07.
Const ForWriting = 2 
08.
Const AsASCII    = 0 
09.
 
10.
If WScript.Arguments.Count > 0 Then 
11.
  Set objFSO = CreateObject("Scripting.FileSystemObject") 
12.
 
13.
  If objFSO.FileExists(objFSO.GetAbsolutePathName(WScript.Arguments(0))) Then 
14.
    strSrcFileName = objFSO.GetParentFolderName(objFSO.GetAbsolutePathName(WScript.Arguments(0))) 
15.
    strSrcFileName = strSrcFileName & "\" & objFSO.GetBaseName(WScript.Arguments(0)) 
16.
    strSrcFileExt  = "." & objFSO.GetExtensionName(WScript.Arguments(0)) 
17.
 
18.
    Set objInFile  = objFSO.OpenTextFile(WScript.Arguments(0), ForReading, False, AsASCII) 
19.
    strFileContent = objInFile.ReadAll 
20.
    objInFile.Close 
21.
 
22.
    arrLines = Split(strFileContent, vbCrLf) 
23.
 
24.
    For I = 1 To nCopies 
25.
      strNumber = Right("0000000000" & CStr(I), nDigits) 
26.
 
27.
      Set objOutFile = objFSO.OpenTextFile(strSrcFileName & strNumber & strSrcFileExt, ForWriting, True, AsASCII) 
28.
 
29.
      For J = 0 To UBound(arrLines) 
30.
        If arrLines(J) = NumberMarker Then 
31.
          objOutFile.WriteLine strNumber 
32.
        Else 
33.
          objOutFile.WriteLine arrLines(J) 
34.
        End If 
35.
      Next 
36.
 
37.
      objOutFile.Close 
38.
    Next 
39.
 
40.
    WScript.Quit 0 
41.
  End If 
42.
 
43.
  WScript.Quit 2 
44.
End If 
45.
 
46.
WScript.Quit 1
Bei fehlerfreier Ausführung hat die CMD-Variable %ERRORLEVEL% den Wert 0, wenn keine Datei als Parameter übergeben wurde den Wert 1 und wenn die Datei nicht existiert den Wert 2.

Gruß
Friemler
Bitte warten ..
Mitglied: Knoepel
08.06.2011 um 21:42 Uhr
Ich sag nur WOW, das ist ja mal sehr viel schneller als das batchen! Saubere Arbeit!

Aber vbs ist für mich noch totales Neuland.

Ich hab das batch script wie folgt umgebaut:

echo Anzahl der auszugebenen Dateien
set /P "nCopies="

echo.
echo Anzahl der Stellen
set /P "nDigits="

echo.
echo Suchbegriff für Änderung
set /P "NumberMarker="

kann man so etwas auch ins vbs einbauen?
Bitte warten ..
Mitglied: Friemler
08.06.2011 um 21:53 Uhr
Hallo Knoepel,

dafür gibt es in VBS die InputBox. Beispiel:
Eingabe = InputBox("Machen Sie eine Eingabe.")
Lade Dir doch mal die Datei script56.chm, eine Sprachreferenz für VBS und JScript (bei Google suchen oder hier in deutsch runterladen).

Gruß
Friemler
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Abfrage Vergleiche mit Variable goto (4)

Frage von Zunaras zum Thema Batch & Shell ...

Batch & Shell
Freigabe von Ethernet durch Batch-Datei erteilen???Möglich? (15)

Frage von DaTobsn zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...