2016-07-27 10 views
0

Ich möchte eine Batch-Datei haben, um alle Dateinamen mit gemeinsamen Präfix zu zählen und die Dateigruppe und ihre Anzahl auszugeben. Ich habe diese Dateien in einem Verzeichnis:Batch-Datei zum Zählen von Dateien mit den ersten 6 Zeichen in Dateiname und Ausgabedateigruppe und deren Anzahl

  • A1110601.zip
  • A1110602.zip
  • A1110603.zip
  • A1120601.zip
  • A1120602.zip

Ich möchte Gruppe die ersten 3 von A11106*.zip und die letzten zwei von A11206*.zip.

Meine gewünschte Ausgabe ist:

A11106: 3 
A11206: 2 

ich versucht habe Beispielcodes aus dem Forum zu kopieren, aber sie meine gewünschte Ausgabe nicht erfüllt.

Hier ist der Code, den ich bisher habe. Aber die Ausgabe ist nicht wie oben beschrieben.

@echo off 
title Store Data Counter 
:recurse 
set I=1 
echo "files counter" 

FOR /f "tokens=*" %%A IN ('dir /a-d /b "Z:\StoreData\A11106*.zip"') do (call :showfiles "%%A") 
echo A111: %I% 

FOR /f "tokens=1" %%A IN ('dir /a-d /b "Z:\StoreData\A11206*.zip"') do (call :showfiles "%%A") 
echo A112: %I% 

pause 
goto :eof 

:showfiles 
echo %1 
set /a I+=1 
goto :eof 
+0

Haben Sie versucht, alles auf eigene Faust weit so? Bitte zeig deine Bemühungen! Woher weißt du, welcher Teil als Präfix betrachtet wird? ist es immer 6 Zeichen lang, wie Ihre Beispiele zeigen? oder ist es alles außer den letzten beiden Charakteren? – aschipfl

Antwort

0

Hier ist ein Stapelcode für diese Aufgabe.

@echo off 
setlocal EnableExtensions 
for %%I in ("*.zip") do call :CountFile "%%~nI" 
for /F "tokens=2,3 delims=#=" %%I in ('set Group# 2^>nul') do echo %%I: %%J 
endlocal 
goto :EOF 

:CountFile 
set "FileName=%~1" 
set "FileGroup=%FileName:~0,6%" 
if "Group#%FileGroup%" == "" (
    set "Group#%FileGroup%=1" 
) else (
    set /A Group#%FileGroup%+=1 
) 
goto :EOF 

"*.zip" mit vollständigem Pfad zu den ZIP-Dateien zu zählen erweitert werden.

Um die verwendeten Befehle und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

Und auch die Microsoft Artikel über Using command redirection operators für eine Erklärung der 2>nul hier verwendet lesen Sie die Fehlermeldung ausgegeben durch Befehl SET von STDERR zu Gerät NUL zu unterdrücken, es im Falle von nein * zu umleiten. Zip-Datei könnte überhaupt gefunden werden.

Die Umleitungsoperator > muss hier mit ^ entwertet werden auf Ausführen Befehl SET interpretiert werden und nicht auf die FOR Befehlszeile Parsen.Andernfalls würde 2>nul ohne ^ als Umleitung für den Befehl FOR interpretiert, der an einer ungültigen Position in der Befehlszeile definiert ist, die aufgrund eines Syntaxfehlers zu einem Stapelausführungsexit führen würde.

+0

Hallo Mofi! Groß! Es war alles was ich brauchte. Danke vielmals :) – Emjey

1

Das Skript folgende Batch sollte das tun, was Sie wollen - uns es mask-count.bat nennen lassen:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

:LOOP 
set "MASK=%~1" 
if defined MASK (
    call :SUB "%~1" 
    shift /1 
    goto :LOOP 
) 

endlocal 
exit /B 


:SUB 
set "ARG=%~1" 
setlocal EnableDelayedExpansion 
set "NUMF=0" 
for /F "skip=4 tokens=1" %%L in (' 
    2^> nul dir /A:-D /N /-C "!ARG!" 
') do (
    set "NUMF=!NUMD!" 
    set "NUMD=%%L" 
) 
echo(!ARG!: %NUMF% 
endlocal 
exit /B 

dieses Skript verwendet werden, liefern die entsprechenden Dateimasken als Argumente Befehlszeile; zum Beispiel:

mask-count.bat "A11106*.zip" "A11206*.zip" 

Dies würde zu der folgenden Ausgabe führen, wenn zu Ihrem Verzeichnis angelegt:

A11106*.zip: 3 
A11206*.zip: 2