starspieler
Goto Top

Dateien in einem Ordner zählen

Hallo,
ich Schreibe derzeit eine Batch Prozedur und habe folgendes Problem.

Ich kopiere aus einem Quellordner eine bestimmte Datei.
Beispiel: "NameDerDatei 2009.08.04.pdf" in ein anderes Verzeichnis (Zielordner) wo bereits eine Datei "NameDerDatei 2009.08.01.pdf"
vorhanden ist.

Soviel zum Standardfall.

Am Ende habe ich zwei Dateien mit der gleichen Bezeichnung, die sich nur am Ende durch ein Datum unterscheiden.
Im Zielordner soll allerdings nach erfolgreichem Kopieren der neuen Datei die alte gelöscht werden.
Problem ist dabei allerdings, dass wenn im Zielordner vorher keine Datei vorhanden war oder das Kopieren nicht geklappt hat, die alte Datei nicht gelöscht werden darf.

Also habe ich mir überlegt den Inhalt des Zielordners in eine .txt-Datei zu Schreiben.

dir /b "NameDerDatei *.pdf" >test.txt

Dabei steht das * für das Datum im Dateinamen.

Wie bekomme ich das jetzt hin?
Also wie gesagt: Sind zwei Dateien ("NameDerDatei *.pdf") vorhanden kann die alte gelöscht werden.
Sollte sich aber nur eine Datei (nach dem Kopiervorgang) im Zielordner befinden, so darf diese nicht gelöscht werden.

Kann mir jemand bei dem Lösungsansatz helfen?

Ich wäre über eine Antwort sehr dankbar

Content-Key: 121969

Url: https://administrator.de/contentid/121969

Printed on: April 19, 2024 at 14:04 o'clock

Mitglied: 60730
60730 Aug 04, 2009 at 10:37:49 (UTC)
Goto Top
Servus und willkommen im Forum,

am "schönsten" ist es immer - wenn man(n) die Batch sieht, an der man mithelfen soll.

dir /b "NameDerDatei *.pdf" >test.txt
wäre dann das einzigste, was derzeit erkennbar ist und daher sollte
dir /b "NameDerDatei *.pdf" |find "1 Datei" && echo einz   
dir /b "NameDerDatei *.pdf" |find "2 Datei" && echo zwei   

Als Ansatz reichen (müssen)

Gruß
Member: starspieler
starspieler Aug 04, 2009 at 12:00:19 (UTC)
Goto Top
Hallo und Danke für deine Antwort!

Ja ich weiß, aber leider kann ich das nicht so einfach Kopieren und hier einfügen.
Die Batch ist ziemlich umfangreich. Alles umzubenennen wäre viel Arbeit. Müsste das unkenntlich machen.
aber ich versuchs mal soweit:


%access% %db% /x "Makro Erstelle Liste"
echo Sobald Sie die neue Uebersichtsliste erstellt haben, fahren Sie bitte fort.

rem Erstellt ein Testverzeichnis im Zielordner, um zu Überprüfen, ob der Benutzer Schreibrechte im Zielverzeichnis hat.
y:
mkdir Y:\Projekte\test
if exist Y:\Projekte\ test goto normal
goto rechteproblem

rem loescht nach erfolgreicher Erstellung das Testverzeichnis.
:normal
rmdir /s /q Y:\Projekte\test

echo Arbeitsschritte:
echo Wechseln in das Verzeichnis der aktuellen Datei
cd /d %quelle%

echo Markieren der aktuellsten Datei als Letzte Datei
for /f "delims=" %%i in ('dir /a-d /b /od *.pdf') do (set Letzte_Datei=%%i)

echo Kopieren der aktuellsten Datei in das Zielverzeichnis
rem Kopiert die aktuelle Datei aus dem Quellverzeichnis in das Zielverzeichnis
copy "%Letzte_Datei%" %ziel%


So das ist jetzt die Stelle an der im Zielordner Überprüft werden muss, ob eine "NameDerDatei *.pdf" vorhanden ist oder sogar zwei!

Sollte sich nur eine darin befinden soll er weiterspringen, sind aber zwei vorhanden dann soll er die letzte löschen.

das Löschen sieht bei mir jetzt so aus:

:loeschen
rem Loeschen der alten Datei im Zielverzeichnis


y:
cd %ziel%
rem pause
for /f "delims=" %%i in ('dir /o-d /b "NameDerDatei *.pdf"') do set alte_datei=%%i
erase /F "%alte_datei%"
goto loeschenerfolgreich
:loeschfehler
rem Ein Loeschfehler kann auftreten, wenn die letzte Datei z.B. in Benutzung ist.
echo Die aktuelle Datei konnte nicht geloescht werden. Bitte pruefen Sie ob die Datei in Benutzung ist.
echo.
echo Bitte Wiederholen Sie den Vorgang Später nochmals oder loeschen Sie die Datei, nach Absprache manuell.

set /p choice=Moechten Sie den Kopiervorgang fortsetzen? (j/n)
if "%choice%" == "j" goto loeschenerfolgreich
if "%choice%" == "n" goto nichterfolgreich
:loeschenerfolgreich
echo Die Datei wurde erfolgreich geloescht

:normal2
echo Sie koennen das Programm jetzt schliessen
pause
goto ende

:rechteproblem
echo Sie haben nicht die erforderliche Berechtigung um die Liste zu aktualisieren!
pause
goto ende

:nichterfolgreich
echo.
echo Das Loeschen der NameDerDatei im Zielverzeichnis ist fehlgeschlagen.
pause
goto ende

:ende


Kann mir Jemand jetzt vll. besser helfen?
Mitglied: 60730
60730 Aug 04, 2009 at 13:08:11 (UTC)
Goto Top
Zitat von @starspieler:
Hallo und Danke für deine Antwort!

Ja ich weiß, aber leider kann ich das nicht so einfach Kopieren
und hier einfügen.
Die Batch ist ziemlich umfangreich. Alles umzubenennen wäre viel
Arbeit. Müsste das unkenntlich machen.

Servus,

das geht ganz einfach mit Notepad und [Strg] [H] suchen & ersetzen.
Schau mal nach speziell Codeblöcke

Nur mal so ein Ansatz - zum "besseren" Lesegefühl..

Sind die Dateinamen mit einem Datum versehen?
Es "scheint" so...
edit
jau der, wo lesen tutet ist wie immer im Vorteil..
/edit

Wenn ja -würde ich einen ganz anderen Ansatz verfolgen.
(nicht den da unten - das ist deiner (Bastlas?) in Code Blöcken)

%access% %db% /x "Makro Erstelle Liste"  
echo Sobald Sie die neue Uebersichtsliste erstellt haben, fahren Sie bitte fort.
 
rem Erstellt ein Testverzeichnis im Zielordner, um zu
Überprüfen, ob der Benutzer Schreibrechte im Zielverzeichnis hat.
y:
mkdir Y:\Projekte\test
if exist Y:\Projekte\ test goto normal
goto rechteproblem
 
rem loescht nach erfolgreicher Erstellung das Testverzeichnis.
:normal
rmdir /s /q Y:\Projekte\test
 
echo Arbeitsschritte:
echo Wechseln in das Verzeichnis der aktuellen Datei
cd /d %quelle%
 
echo Markieren der aktuellsten Datei als Letzte Datei
for /f "delims=" %%i in ('dir /a-d /b /od *.pdf')  
do (set Letzte_Datei=%%i)
 
echo Kopieren der aktuellsten Datei in das Zielverzeichnis
rem Kopiert die aktuelle Datei aus dem Quellverzeichnis in das Zielverzeichnis
copy "%Letzte_Datei%" %ziel%  
...den da...
:para
set "Jahr=%date:~-4%"  
set "Monat=%date:~-7,2%"  
set "Tag=%date:~-10,2%"  
set "WTag=%date:~-13,2%"  
:access
start /wait "Datenbank" %access% %db% /x "Makro Erstelle Liste"  
if exist %ziel%\namederdatei.*.pdf del %ziel%\namederdatei.*.pdf
move %quelle%\namederdatei.%jahr%-%monat%-%Tag%.pdf %ziel%\namederdatei.%jahr%-%monat%-%Tag%.pdf

Gruß
Member: starspieler
starspieler Aug 10, 2009 at 07:53:14 (UTC)
Goto Top
hallo,
ich habe jetzt dafür eine Lösung gefunden.

Jetzt brauche ich aber noch Hilfe für ein anderes Problem.

Und zwar habe ich eine Abfrage eingebaut. Diese soll mit "j" oder "n" beantwortet werden.
bei allen anderen eingaben soll die abfrage erneut beginnen.

set /p choice=Moechten Sie den Kopiervorgang fortsetzen? (j/n)
if "%choice%" == "j" goto auswahlja
if "%choice%" == "n" goto auswahlnein

klingt zwar doof und unrealistisch, dass wirklich mal jemand auf die super idee kommt und n eingibt, sondern 1,2,3 oder !,h,ö,ü aber so solls dann gelöst werden.
Hat jemand eine Ahnung wie man sowas lösen kann?

LG
Member: Biber
Biber Aug 10, 2009 at 08:27:46 (UTC)
Goto Top
Moin starspieler,

ich hätte als zuständiger Moderator dieses Zweigarms eine klitzekleine Bitte

Zitat von @starspieler:
hallo,
ich habe jetzt dafür eine Lösung gefunden.

Jetzt brauche ich aber noch Hilfe für ein anderes Problem.
Und Du denkst, so ein Feedback ist der Sinn eines Forums?
Wenn Du einen Lösungsansatz/Lösungsvorschlag bekommen hast, bei dem nur Du allein bestätigen kannst, ob dieser die Anforderungen erfüllt, dann ist doch sinnvoll zu antworten
  • "Danke, das war der richtige Tipp"
-oder-
  • "Netter Versuch, aber das hilft mir nicht über'n Winter, weil...."
-oder-
  • "Habe Deinen Ansatz nicht ausprobiert, weil mir zwischenzeitlich eine ganz andere idee kam, und zwar habe ich es jetzt so gelöst..."

Außerdem hat T-Mo ein paar (für seine Verhältnisse) überaus geduldige und freundliche Hinweise gegeben:
am "schönsten" ist es immer - wenn man(n) die Batch sieht, an der man mithelfen soll.

Schau mal nach Formatierungshilfe speziell Codeblöcke

...die eigentlich hätten wahrgenommen werden müssen, wenn die Du die Antworten genauso ernst nehmen würdest wie wir Deine Noob-Gehversuche.

Wenn Du erwartest, dass uns Deine Prioritäten interessieren, dann zeige bitte auch Deine Kompromissbereitschaft bezüglich unserer Verhaltensregeln.

Und zu guter Letzt, weil genau diese Hohlphrase immer in meinem Bereich abgeladen wird

Ich wäre über eine Antwort sehr dankbar

Leicht begeisterungsfähige Menschen können sich über eine Antwort vielleicht freuen und/oder für eine Antwort dankbar sein. Aber nicht umgekehrt.

Damals in meinem ersten Mittelstufen-Praktikum, als ich die Rohfassung des Ur-Dudens geschrieben habe, bekam ich immer Punktabzug für so etwas.


Zu Deiner Frage:
Du kannst z.B in allen nicht "j"/"n"-Fällen die Abfrage wiederholen, bis der geneigte DAU es verstanden hat.
....
:Abfrage
 	set /p choice=Moechten Sie den Kopiervorgang fortsetzen? (j/n)
 	if  /i "%choice%" == "j" goto auswahlja  
 	if  /i "%choice%" == "n" goto auswahlnein  
                     echo Bitte nur J oder N eingeben!
                     goto :Abfrage

Der Schalter /i beim IF-Stringvergleich ignoriert Klein/Gross-Schreibunterschiede (erlaubt "j" und "J" und "n"/"N").

Grüße
Biber
Member: starspieler
starspieler Aug 10, 2009 at 08:43:04 (UTC)
Goto Top
Sorry und danke für den Hinweis.
Es war nicht meine Absicht hier die Antworten und die Hilfe mit Füßen zu treten.

Also nocheinmal ein kleiner Ausflug in die vorherige Problematik (Löschen).
Ich habe die vorhandene Datei einfach mit einer Extesion versehen (.SAV)
und im Zielordner gelassen.
Nach erfolgreichem Kopiervorgang der neuen Datei habe ich die .SAV Datei einfach gelöscht.
Sollte der Kopiervorgang nicht erfolgreich sein. Benenne ich die Datei einfach wieder um, oder besser gesagt ich lösche die Extension .SAV

das habe ich wie folgt gelöst:


 :pdfvorhanden
	rename "NameDerDatei *.pdf" "NameDerDatei *.pdf.SAV"  

:altedateiwiederherstellen
        for %%i in ("NameDerDatei *.pdf.SAV") do rename "%%i" "%%~ni" goto endewiederhergestellt  

mit dem letzten Befehl wird einfach die Extension gelöscht. Das ist nicht die eigentliche Endung .pdf sondern in dem Fall die .SAV.


Soviel dazu.
Zu der anderen Problematik. Natürlich habe ich mir schon gedacht, dass ich einfach die Abfrage wiederholen könnte. Aber das soll halt anders gelöst werden. Bei dem Testszenario soll eine falsche Eingabe wieder zum Beginn der Abfrage führen.


EDIT:
ich habs jetzt einfach mal so gelöst:

:falscheeingabe	
	set /p choice=Moechten Sie den Kopiervorgang fortsetzen? (j/n)
	if /i "%choice%" == "j" goto auswahlja  
	if /i "%choice%" == "n" goto auswahlnein  
	echo Sie haben eine falsche Eingabe getaetigt. Bitte geben Sie einen richtigen Parameter an (j/n).
pause
	goto falscheeingabe