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 Zählerfunktion in Batch Datei

Mitglied: MacLeod

MacLeod (Level 1) - Jetzt verbinden

12.03.2006, aktualisiert 13.03.2006, 9854 Aufrufe, 16 Kommentare

Sortieren von Dateien

Hallo.
Ich stehe vor einem für euch wahrscheinlich trivialen Problem. Eingehende Dateien auf einem FTP (lokal) sollen anhand von einem String in der Datei in entsprechende Unterverzeichnisse verschoben/kopiert werden. Habe hier schon etwas umhergelesen und einen Teilerfolg erzielt:
del temp.txt
SET LAUFN=0001
dir k:\_incoming\ /s /b |find "%LAUFN%" > temp.txt
FOR /f "eol=; tokens=1,2* delims=," %%i IN (temp.txt) DO @xcopy "%%i" k:\test\%LAUFN%\ /y
Nun soll dieser Ablauf aber mehrmals durchgeführt werden und zwar mit 0001, 0002, 0003 und so weiter. Ideal wäre die Angabe über Startnummer/Schrittweite/Endnummer. Duchläufe gehen bis zu 100.000 Der Zeitaspekt ist aber Nebensache.
Mein Betriebssystem ist Win2003SP1 und bei den Datein handelt es sich um reine Binärdateien, kein Text oder ähnliches.
Ich bin für jeden Tipp dankbar.
Gruß,
Peter
Mitglied: stpe
12.03.2006 um 20:59 Uhr
Leider können Batch-Dateien nicht rechnen oder zählen. Eine Lösung ist über einen kleinen Umweg möglich:

Lege eine Datei an, in der alle laufenden Zahlen Zeile für Zeile stehen, also:
<font class="code">0001
0002
0003
...</font>
Dann kannst Du diese Datei in einer For-Schleife "durchzählen" lassen:

<font class="code">for /F %%z in (nummern.txt) do for FOR /f "eol=; tokens=1,2* delims=," %%i IN (temp.txt) DO @xcopy "%%i" k:\test\%z%\ /y</font>

Ich hoffe, ich konnte helfen.
Stefan
Bitte warten ..
Mitglied: MacLeod
12.03.2006 um 21:10 Uhr
Hmmm. Für kleinere Zahlenbereiche ist diese Idee optimal. Aber bei bis zu 100000 Zahlen recht mühsam. Außer ich bastel mir ein Script, welches diese Nummerndatei automatisch erzeugt.
Vielen Dank erstmal.
Gruß,
Peter

Edit: Funktioniert leider nicht. Denn erst wird anhand der Such-Zahl die Liste der betreffenden Dateien gebildet (temp.txt) und dann kopiert. Mit einer neuen Such-Zahl muss auch wieder erst eine neue temp.txt erstellt werden. Ich glaube ich bräuchte eine echte Schleife in der Batch selbst.
So etwa:

:Start
Laufnummer = Laufnummer +1
Prüfe ob Laufnummer = Endnummer dann GOTO :EXIT
Konvertiere Laufnummer zu Laufvariable
"Kopierfunktion komplett"
GOTO :START
: EXIT
Bitte warten ..
Mitglied: stpe
12.03.2006 um 21:37 Uhr
Auf der Linux-Bash kann man zählen ;)

Nimm diese: link nicht mehr verfuegbar
Gruss
Stefan
Bitte warten ..
Mitglied: stpe
12.03.2006 um 21:46 Uhr
Hatte Deinen Edit gerade erst gelesen.

Integrier die Erstellung der temp.txt mit Deiner for-Schleife in eine Sub-Routine. Diese lässt Du von der "Ich zähl bis 100.000"-Schleife immer anspringen.

Habe gerade leider kein Windows zur Verfügung, aber das Konstrukt koennte dann in etwa so aussehen:

<font class="code">for /F %%z in (nummern.txt) do call :kopieren
goto ende

:kopieren
dir k:\_incoming\ /s /b |find "%z%" > temp.txt
FOR /f "eol=; tokens=1,2* delims=," %%i IN (temp.txt) DO @xcopy "%%i" k:\test\%z%\ /y
return

:ende</font>
Bitte warten ..
Mitglied: djbrandt
12.03.2006 um 21:56 Uhr
Hi,

mit set /A läßt sich bei XP rechnen

Die /A-Option gibt an, dass die Zeichenfolge rechts vom Gleichheitszeichen
ein nummerischer Ausdruck ist, der ausgewertet wird. Das Auswertungsprogramm
des Ausdrucks unterstützt dabei die folgenden Vorgänge, entsprechend ihrer
Anordnung mit abnehmendem Vorrang:

() - Gruppierung
! ~ - - monäre Operatoren
          • / % - arithmetische Operatoren
          + - - arithmetische Operatoren
          << >> - logische Verschiebung
          & - bitweise UND
          ^ - bitweise exklusives ODER
          | - bitweise ODER
          = *= /= %= += -= - Zuordnung
          &= ^= |= <<= >>=
          , - Trennzeichen für Ausdrücke


          Damit kannst Du Deine Schleifen bauen

          set /A bla=1
          1
          set /a bla=%bla%+1
          2
          echo %bla%
          2
          set /a bla=%bla%+1
          3
          echo %bla%
          3


          Gruß

          Dieter
Bitte warten ..
Mitglied: MacLeod
12.03.2006 um 21:58 Uhr
Prima.
Das probiere ich morgen früh gleich mal.
Vielen Dank,
Peter
Bitte warten ..
Mitglied: stpe
12.03.2006 um 22:04 Uhr
Habe nie mit XP gearbeitet, vorher ging das nicht. Man lernt immer dazu.

Danke und 5 Sternchen dafür

Gruss
Stefan
Bitte warten ..
Mitglied: Biber
12.03.2006 um 22:49 Uhr
Hmm,
Im Batch lässt sich schon hochzählen und rechnen.

Und wie man/frau aus einer Zählvariablen (1,2,3...) einen formatierten Text macht ("0001", "0002", ..) hab ich u.a. in dem Batch-Tut II ("Ein bisschen Handwerkszeug..") beschrieben.

Aber die Mimik selbst ist mir bei Dir noch nicht klar, MacLeod.
Bei Dir sind im Incomingverzeichnis immer Dateien, die ein "0058"..."0077", "0013" im Namen haben? Oder wie muss ich mir das vorstellen?

Rückfragend
Biber
Bitte warten ..
Mitglied: MacLeod
12.03.2006 um 23:11 Uhr
Hallo.
Die Dateien haben den String leider nicht im Namen sondern im Binärcode. Der Dateinamen kann irgendeine beliebige Form und Endung haben.
Gruß,
Peter
Bitte warten ..
Mitglied: Schirrmeister
13.03.2006 um 08:24 Uhr
Will doch auch meinen Senf dazugeben...
Du sagst, Du brauchst die Zählernummer mit führenden Nullen, dann würde ich die äußere Zählerschleife so machen:
01.
setlocal enableextensions
02.

03.
for /L %%i in ( 1, 1, 100000 ) do (
04.
&nbsp;&nbsp;&nbsp;&nbsp;set LAUFN=00000%%i
05.
&nbsp;&nbsp;&nbsp;&nbsp;set LAUFN=!LAUFN:~-6!
06.
&nbsp;&nbsp;&nbsp;&nbsp;...
07.
)
08.

09.
endlocal
Die Ausrufezeichen (statt %) sind nötig, damit die Variable jedesmal neu ausgewertet wird, dafür ist auch das enableextensions.
Bei der weiteren Verwendung mußt Du dann auch !LAUFN! schreiben, statt %LAUFN%.
Bitte warten ..
Mitglied: MacLeod
13.03.2006 um 14:33 Uhr
Hallo.
Ich bekomme es nicht hin. Er zählt zwar durch was man am set LAUFN... noch sieht, aber mit echo bekomme ich nie etwas angezeigt. Und auch beim dir/find steht dann nichts drin. Habe alle möglichen Variationen durchprobiert. Hat noch jemand eine Idee?
Danke,
Peter

setlocal enableextensions
for /L %%k in ( 1, 1, 10 ) do (
del temp.txt
set LAUFN=00000%%k
set LAUFN=!LAUFN:~-6!
echo !%LAUFN%
dir k:\_incoming\ /s /b |find "!LAUFN!" > temp.txt
FOR /f "eol=; tokens=1,2* delims=," %%i IN (temp.txt) DO @xcopy "%%i" k:\test\%LAUFN%\ /y
)
Bitte warten ..
Mitglied: Biber
13.03.2006 um 14:59 Uhr
Moin MacLeod,

das sind ja zweieinhalb Probleme, die da drin sind.
1) die formale Syntax
2) die "0000x" im Binärcode statt im Namen
2,5) die Fehlermeldung, wenn keine Datei mit "0000x" gefunden (das halbe Problem)

ad 1) So ist es formal richtig (mit der LAUFN-Variable; Rest ausgeREMt):
01.
 @echo off & setlocal enabledelayedexpansion
02.
for /L %%k in ( 1, 1, 10 ) do ( 
03.
    rem echo del temp.txt 
04.
    set "LAUFN=00000%%k"
05.
    set "LAUFN=!LAUFN:~-6!" 
06.
    echo !LAUFN!
07.
    rem dir k:\_incoming\ /s /b 2>nul |find "!LAUFN!" >temp.txt 
08.
    rem FOR /f "eol=; tokens=1,2* delims=," %%i IN (temp.txt) DO @xcopy "%%i" k:\test\%LAUFN%\ /y 
09.
)  
ad 2)
mit dem "DIR K:\incoming /s /b .." werden Dir doch nur Dateinamen geliefert.
Wenn das "0000x" aber in den Dateien selbst enthalten ist, musst Du auch die Dateien selbst mit Find durchsuchen.
Und abhängig von "Gefunden"=Errorlevel 0 bzw. Errorlevel 1 ="nicht gefunden" diese Datei kopieren.

ad 2,5)
dir k:\_incoming\ /s /b 2>nul |find "!LAUFN!" >temp.txt
...mit 2>nul die DIR-Nicht-gefunden-Meldung entsorgen


Gruß
Biber
Bitte warten ..
Mitglied: Schirrmeister
13.03.2006 um 15:01 Uhr
Dein echo ist ja auch nicht korrekt, ich sagte doch, Du musst dann IMMER ! nehmen.
Wenn Du %LAUFN% hinschreibst, wird das ausgewertet, bevor die Schleife ausgeführt wird, und da ist die Variable noch nicht gesetzt.
Bitte warten ..
Mitglied: MacLeod
13.03.2006 um 15:27 Uhr
Stimmt. Ihr habt natürlich recht!
Er sucht nur in Dateinamen. Habe vor lauter Bäumen den Wald nicht mehr gesehen.
Also müsste ich erst das Dir in eine Liste -> jede Datei nach String durchsuchen und bei Treffer ab in eine zweite Liste -> Kopieren.
Jetzt überlege ich, ob man das Problem nicht besser in einem echten Compiler aufdröselt. Das altbewährte Powerbasic wäre wohl ideal dafür. Da kann ich dann auch schneller mehr Schicki-micki einbauen, wenn mir noch etwas einfällt.
Ich danke euch allen erst mal ganz herzlich.
Gruß,
Peter
Bitte warten ..
Mitglied: MacLeod
13.03.2006 um 21:09 Uhr
Erfolg!
Es geht auch ohne Powerbasic:

@echo off & setlocal enabledelayedexpansion
for /L %%k in ( 1, 1, 5 ) do (
del temp.txt
set "LAUFN=00000%%k"
set "LAUFN=!LAUFN:~-6!"
echo !LAUFN!
FINDSTR /s /m /C:"!LAUFN!" k:\_incoming\*.* > temp.txt
FOR /f "eol=; tokens=1,2* delims=," %%i IN (temp.txt) DO @xcopy "%%i" k:\test\!LAUFN!\ /y /f /r
)
endlocal
pause

Danke nochmal,
Peter
Bitte warten ..
Mitglied: Biber
13.03.2006 um 21:31 Uhr
Glückwunsch, MacLeod,

nur für die kommenden Jahre der Pflege und Wartung Deines Batches (weil Du bestimmt in drei Monaten nicht mehr weißt, ob da alle Schalter einen Sinn machen):


...
FINDSTR /s /m /C:"!LAUFN!" k:\_incoming\*.* > temp.txt
... geht in diesem Fall sicher besser als mit Find.exe.
Der Befehl würde auch Dateien mit Leerzeichen oder mit Kommata im Namen finden.

---> Dann aber muss der FOR-Befehl die auch entgegennehmen wollen:

Bisher:
FOR /f "eol=; tokens=1,2* delims=," %%i IN (temp.txt) DO @xcopy "%%i" k:\test\!LAUFN!\ /y /f /r

-----> ein "eol=;" KANN nie benötigt werden.
-----> ein "tokens="1,2* delims=," macht auch keinen Sinn, wenn tatsächlich ein Komma im Namen sein könnte. Dann wird der XCOPY nichts finden.

Demnach reicht vollkommen:
FOR /f "delims=" %%i IN (temp.txt) DO xcopy "%%i" k:\test\!LAUFN!\ /y /f /r


Ist ein bisschen wartbarer, denke ich.

Gruß
Biber
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
BATCH ini Datei Datei auslesen
gelöst Frage von Juergen42Batch & Shell2 Kommentare

Hallo zusammen, ich möchte eine ini Datei auslesen mit folgenden Aufbau INHALT DER INI ID=30 NAME="test1" PFAD="K:\Kontoauszug\Test1\*.pdf" PFAD_S="K:\Kontoauszug\Test1\Sicherung\" ID=28 ...

Batch & Shell
Batch Datei Ordnerüberwachung
Frage von Phant0xBatch & Shell1 Kommentar

Hallo zusammen, könntet ihr mir helfen eine Batch Datei zu schreiben, die einen bestimmten Ordner kontrolliert, ob sich Dateien ...

Batch & Shell
Batch-Datei erstellen
gelöst Frage von tocksickBatch & Shell2 Kommentare

Hallo liebe Gemeinde! Ich bin dabei eine Batch-Datei zu schreiben welche folgendes tun soll: Die Batch soll alle auf ...

Batch & Shell
Batch Datei Kopieren
gelöst Frage von FragerBatch & Shell17 Kommentare

Hallo Zusammen, ich bekomme es nicht hin ich muss aus einem Ordner (liegt auf einem Server) eine von vielen ...

Neue Wissensbeiträge
Humor (lol)
Und wie seid Ihr gegen Cyberattacken gewappnet?
Information von DerWoWusste vor 22 StundenHumor (lol)5 Kommentare

aber wo ist der Hammer? :-)

Sicherheit
Ein weiterer Microsoft-Stirnklatscher
Information von DerWoWusste vor 1 TagSicherheit7 Kommentare

Habe gerade einen Artikel zu einem Sicherheitsproblem gefunden, welches mir zu seiner Zeit (gepatcht 2015) wohl durchgerutscht ist. Es ...

Windows 10
Upgradepfade Windows 10 LTSC
Erfahrungsbericht von Datenreise vor 1 TagWindows 10

Nur eine kurze Info, für diejenigen, die es interessiert, da es hierzu im Netz aus nachvollziehbaren Gründen nicht allzu ...

Administrator.de Feedback
Wartungsarbeiten heute Nacht (Update)
Information von Frank vor 2 TagenAdministrator.de Feedback10 Kommentare

Hallo User, durch Umbauarbeiten in unserem Rechenzentrum (am Backbone) kann es heute Nacht (14-15.01.2019) zu kurzen Ausfällen unserer Seite ...

Heiß diskutierte Inhalte
Windows 10
Windows 10 - kein Boot mehr nach Domänenaustritt
gelöst Frage von Ghost108Windows 1025 Kommentare

Hallo zusammen, habe hier eine Windows 10 Maschine, die ich gerne aus der Domäne austreten lassen möchte. Nach Austritt ...

Windows 10
Windows 10 1803 - nicht identifiziertes Netzwerk - kein Login an Domäne möglich
Frage von Tomy389Windows 1022 Kommentare

Hallo Zusammen, ich hoffe zu dem Thema gibt es nicht schon einen Thread aber ich sollte eigentlich schon alles ...

Exchange Server
Microsoft Exchange Ser ver 2016 CU 8 auf den neuesten Stand bringen
gelöst Frage von Hendrik2586Exchange Server21 Kommentare

Hallo an euch alle. :) Kurze Frage. Ich habe hier einen Exchange Server wie o.g. Problem ist das wir ...

Microsoft
SFirm 4.0 auf Terminalserver startet für jeden angemeldeten Benutzer diverse Dienste
Frage von Frank84Microsoft20 Kommentare

Hallo zusammen, wir verwenden Sfirm 4.0 auf einem Terminalserver (der SQL Server ist auf einem separaten Server), das Problem ...