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
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, 5708 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 ..
Ähnliche Inhalte
Batch & Shell
Batch - Variablen
gelöst Frage von Marlon1Batch & Shell2 Kommentare

Hallo, Ich habe eine Frage zu Variablen. Und zwar ob es irgendwie geht das Batch mit ein IF Befehl ...

Batch & Shell
Wie Ordner und fortlaufend nummerierte Unterordner aus Text mit Batch erstellen?
gelöst Frage von LinoVanBinoBatch & Shell9 Kommentare

Hallo Zusammen, leider bin ich kein Script Fachmann, aber muss mich hier einer Aufgabe stellen. Ich muss/will mit einer ...

Batch & Shell
Batch für Textdatei - Sonderzeichen an bestimmter Stelle in fortlaufender Ausgabe
gelöst Frage von Steven123Batch & Shell4 Kommentare

Hallo Zusammen, ich habe ein Problem, bei dem ich nicht weiterkomme und Euere Hilfe benötige. Ich habe eine Textdatei, ...

Batch & Shell
Batch-Variable rechnet immer weiter
Frage von ZwergkaninchenBatch & Shell4 Kommentare

Hallo, Leute! Ich wollte mir ein kleines Idle-Game in Batch schreiben, aber ich komm nicht weiter. Hier ist ein ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 1 TagWindows 107 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 1 TagSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 2 TagenInternet5 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 2 TagenDSL, VDSL2 Kommentare

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

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
gelöst Frage von HelloWorldBatch & Shell20 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

Router & Routing
OpenWRT bzw. L.E.D.E auf Buffalo WZR-HP-AG300H - update
gelöst Frage von EpigeneseRouter & Routing11 Kommentare

Guten Tag, ich habe auf einem Buffalo WZR-HP-AG300H die alternative Firmware vom L.E.D.E Projekt geflasht. Ich bin es von ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless8 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Windows Server
Ping auf einen bestimmten Server nicht möglich
gelöst Frage von a.thierWindows Server7 Kommentare

Hallo, ich habe folgendes Problem. srv-dc1: Ping srv-nav > geht Ping srv-exchange > geht nicht srv-exchange: Ping srv-dc1 > ...