Dateien nach Dateinamen komprimieren

427
Guest

Täglich erhalten wir fünf Dateien wie folgt:

vi_250000364846.dqa_report.xlsx
vi_250000364846.3553_report
vi_250000364846.MSR_report
vi_250000364857.3553_report
vi_250000364857.dqa_report.xlsx

Die Nummern im Dateinamen unterscheiden sich von Tag zu Tag, sind jedoch für die drei erforderlichen Dateien gleich. Ich muss diese drei Dateien nur an einen komprimierten ZIP-Ordner senden.

Ich habe den folgenden Code geschrieben, die erste Datei wird jedoch mehrmals verwendet und derselbe Wert wird fünfmal angezeigt:

@echo on  set LOGFILE=batch.log  call :LOG > %LOGFILE%  exit /B   :LOG  setlocal EnableDelayedExpansion  set n=0  set count=0  set vector[%n%]=0  for /f "tokens=* delims=." %%i in ('dir /b /a-d "C:\Test"') do (  set filename=%%i  for /f "tokens=2 delims=_." %%a in ("%filename%") do (  set vector[!n!]=%%a  for /f "tokens=* delims==" %%v in ('set vector[%n%]') do @echo %%v  )  set /A n+=1  ) 

Ich bin nicht sicher, warum die zweite Datei nicht als Parameter verwendet wird. Ich versuche, ein Array der Zahlen in allen fünf Dateinamen zu erstellen und diese Array-Werte dann zu vergleichen.

Bitte helfen Sie mir herauszufinden, wo es schief geht.

0
Weder aus Ihrem Code noch aus der Beschreibung ist ersichtlich, welche ** 3-Dateien Sie komprimieren möchten. Das erste "for / f" scheint nicht notwendig zu sein, da Sie es einfach zum Aufzählen der Dateien verwenden und das dritte ist fehl am Platz. es sollte sich außerhalb von oter für / f befinden. LotPings vor 5 Jahren 0

1 Antwort auf die Frage

0
ShadowRanger

Es gibt ein paar Stellen, an denen Sie eifrige Erweiterungen (mit %Trennzeichen) verwendet haben, an denen Sie verzögerte Erweiterungen (mit !Trennzeichen) hätten verwenden sollen. Das zu beheben scheint das gewünschte Verhalten zu erhalten:

@echo on  set LOGFILE=batch.log  call :LOG > %LOGFILE%  exit /B   :LOG  setlocal EnableDelayedExpansion  set n=0  set count=0  set vector[%n%]=0  for /f "tokens=* delims=." %%i in ('dir /b /a-d "C:\Test"') do (  set filename=%%i  for /f "tokens=2 delims=_." %%a in ("!filename!") do (  set vector[!n!]=%%a  for /f "tokens=* delims==" %%v in ('set vector[!n!]') do @echo %%v  )  set /A n+=1  ) 

Um es klar zu sagen: Die Änderungen, die ich vorgenommen habe, sind:

for /f "tokens=2 delims=_." %%a in ("%filename%") do ( 

gewechselt zu:

for /f "tokens=2 delims=_." %%a in ("!filename!") do ( 

und:

for /f "tokens=* delims==" %%v in ('set vector[%n%]') do @echo %%v 

gewechselt zu:

for /f "tokens=* delims==" %%v in ('set vector[!n!]') do @echo %%v 

Ohne diese Änderungen %filename%wird immer auf die leere Zeichenfolge %n%erweitert und auf 0 erweitert (der Wert, auf den es gesetzt wurde, als die äußere forgestartet wurde); Im letzteren Fall hat dies nur Ihre Ausgabe verfälscht (Sie haben sie !n!beim Zuweisen richtig verwendet vector, also hatten sie die korrekten Werte, es wurde lediglich der erste Eintrag gedruckt, selbst wenn Sie Einträge in nachfolgenden Indizes hinzugefügt hatten).