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

Zählerfunktion in Batch Datei

Frage Entwicklung Batch & Shell

Mitglied: MacLeod

MacLeod (Level 1) - Jetzt verbinden

12.03.2006, aktualisiert 13.03.2006, 9579 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 ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
Ä in batch Datei (12)

Frage von BergEnte zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...