rohu2007
Goto Top

Wenn bestimmtes Datum dann bestimmte Datei kopieren

Hallo Zusammen,

ich komme leider nicht weiter.

Ich möchte eine Datei kopieren, wenn ein bestimmtes Datum eintrifft.

Das heutige Datum soll vom System abgefragt werden (04.04.2016)
Wenn das heutige Datum mit dem Vergleichsdatum gleich sind, soll der Copiervorgang gestartet werden.

zum Beispiel:

@echo off
set Datum=%date%


if "Datum" == "04.04.2016"  

(
xcopy "meinVerzeichnisPfad\Test_Batch\1.txt" "meinVerzeichnisPfad\kopiert" &  
ren "meinVerzeichnisPfad\Test_Batch\kopiert\1.txt" "aktuell.txt"  
)


Kenne mich mit der Programmierung nicht gut aus und finde daher den Fehler nicht.

Für eure Hilfe bin ich im Voraus sehr dankbar.

Content-Key: 300898

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

Ausgedruckt am: 28.03.2024 um 17:03 Uhr

Mitglied: bastla
bastla 04.04.2016 aktualisiert um 23:28:11 Uhr
Goto Top
Hallo rohu2007 und willkommen im Forum!

Abgesehen davon, dass die Variable für das Datum eigentlich unnötig scheint, wäre sie in Zeile 5 als %Datum% zu schreiben; sinnvoller wäre es mE, eine Variable zumindest für die Quelldatei zu verwenden - daher könnte das zB eher so aussehen:
@echo off & setlocal
set "Quelle=meinVerzeichnisPfad\Test_Batch\1.txt"  
set "Ziel=meinVerzeichnisPfad\kopiert"  

if "%date%" == "04.04.2016" xcopy "%Quelle%" "%Ziel%\" && ren "%Quelle%" "aktuell.txt"  
Sollte das Zielverzeichnis noch nicht existieren, stellt der angefügte Backslash sicher, dass es ohne Rückfrage erzeugt wird.

Die Verknüpfung des xcopy und des ren mit && sorgt dann noch dafür, dass nur bei einem erfolgreichen Kopiervorgang (Ende mit Errorlevel 0) die Umbenennung durchgeführt wird ...

Grüße
bastla
Mitglied: agowa338
agowa338 05.04.2016 aktualisiert um 13:51:59 Uhr
Goto Top
Und hier noch eine kleine Lösung mittels PowerShell:
$date = "05.04.2016";  
$source = "C:\sourceFolder\1.txt";  
$destination = "C:\destinationFolder";  
$sourceNewName = "aktuell.txt";  

If (($date.ToDateTime([System.Globalization.CultureInfo]::CurrentCulture)).CompareTo((Get-Date)) -ne 1) 
{
    Copy-Item -Path $source -Destination $destination -Force;
    Rename-Item -NewName $sourceNewName -Path $source -Force;
}
Mitglied: rohu2007
rohu2007 05.04.2016 um 07:18:07 Uhr
Goto Top
Vielen Dank für eure Hilfe.
Funktioniert wunderbar, zumindest die Lösung von bastla.

musste es nur ein wenig umbauen, weil die quelldatei umbenannt wurde.

@echo off & setlocal 

set "Quelle=meinVerzeichnisPfad\Test_Batch\1.txt"   

set "Ziel=meinVerzeichnisPfad\Test_Batch\kopiert"   

if "%date%" == "05.04.2016" del "%Ziel%\aktuell.txt" && xcopy "%Quelle%" "%Ziel%\" && ren "%Ziel%\*.txt" "aktuell.txt"  

@agowa338:
lässt sich ein PowerShell Script per Batch ausführen?
Mitglied: MrCount
MrCount 05.04.2016 um 07:51:55 Uhr
Goto Top
Zitat von @rohu2007:

lässt sich ein PowerShell Script per Batch ausführen?

Ja, z.B. so:

@echo off
powershell.exe -executionpolicy remotesigned -File DeinPowershellScript.ps1
Mitglied: rohu2007
rohu2007 05.04.2016 um 08:30:45 Uhr
Goto Top
Hallo Zusammen,

ich möchte die Abfrage so gestalten:

@echo off & setlocal  

if "%date%" == "05.04.2016"   

set "Quelle=meinVerzeichnisPfad\Test_Batch\1.txt"    
set "Ziel=meinVerzeichnisPfad\Test_Batch\kopiert"    

del "%Ziel%\aktuell.txt" && xcopy "%Quelle%" "%Ziel%\" && ren "%Ziel%\*.txt" "aktuell.txt"  

Ich möchte also erst abfragen welches Datum es ist und dann den Pfad zur Quelldatei setzen.

Eins habe ich noch vergessen zu erwähnen: diese Datumsabfrage muss 48 mal passieren, um genauer zu sein jeden Sonntag, da es normalerweise 48 Sonntage im Jahr gibt.

Vom Prinzip her soll es so ablaufen:
Abfrage Datum
wenn Datum gleich Datum von Heute
dann setze das Quellverzeichnis und führe die Befehle aus

wenn Datum nicht gleich Datum von Heute
dann gehe zur nächsten IF Abfrage

usw.

Ich hoffe, ich konnte es nun etwas genauer darstellen.

Vielen Dank an euch im Voraus!
Mitglied: MrCount
MrCount 05.04.2016 um 09:37:14 Uhr
Goto Top
Den Wochentag kannst du z.B. so abfragen:

@echo off & setlocal 
REM Wochentag als Zahl
for /F "skip=2 tokens=2-4 delims=," %%A in ('WMIC Path Win32_LocalTime Get DayOfWeek /Format:csv') do set daynr=%%A    
 
REM Wochentag ausgeschrieben
set daysofweek=Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag
for /F "tokens=%daynr% delims=," %%B in ("%daysofweek%") do set day=%%B  

if "%day%"=="Montag" goto mo  
if "%day%"=="Dienstag" goto di  
if "%day%"=="Mittwoch" goto mi  
if "%day%"=="Donnerstag" goto do  
if "%day%"=="Freitag" goto fr  
if "%day%"=="Samstag" goto sa  
if "%day%"=="Sonntag" goto so  

goto end

:mo
echo %day%
goto end

:di
echo %day%
goto end

:mi
echo %day%
goto end

:do
echo %day%
goto end

:fr
echo %day%
goto end

:sa
echo %day%
goto end

:so
echo %day%
HIER DEIN CODE FUER SONNTAG
goto end


:end
Mitglied: rohu2007
rohu2007 05.04.2016 um 10:07:44 Uhr
Goto Top
Hallo.

Ich möchte ja nur das Datum eines Sonntags abfragen weil ich die batch durch die Aufgabenplanung laufen lasse.
Das Problem, dass an jedem Sonntag des Jahres, eine andere Datei aus dem Quellverzeichnis kopiert werden soll.

ich dachte es mir in etwa so:

@echo off & setlocal

set "Quelle=meineQuelle"  

set "Ziel=meinZiel"  


if "%date%" == "03.01.2016"   
del "%Ziel%\*.wav" && xcopy "%Quelle%\16.wav" "%Ziel%\" && ren "%Ziel%\*.wav" "aktuell.wav"  


if "%date%" == "10.01.2016"   
del "%Ziel%\*.wav" && xcopy "%Quelle%\17.wav" "%Ziel%\" && ren "%Ziel%\*.wav" "aktuell.wav"  


if "%date%" == "17.01.2016"   
del "%Ziel%\*.wav" && xcopy "%Quelle%\18.wav" "%Ziel%\" && ren "%Ziel%\*.wav" "aktuell.wav"  
Mitglied: agowa338
agowa338 05.04.2016 aktualisiert um 14:20:22 Uhr
Goto Top
$date = @("05.04.2016", "06.05.2016", "07.05.2016");  
$source = @("C:\sourceFolder\1.txt", "C:\sourceFolder\2.txt", "C:\sourceFolder\3.txt");  
$destination = "C:\destinationFolder";  
$sourceNewName = "aktuell.txt";  

If (($date.ToDateTime([System.Globalization.CultureInfo]::CurrentCulture)).CompareTo((Get-Date)) -ne 1) 
{
    Copy-Item -Path $source -Destination $destination -Force;
    Rename-Item -NewName $sourceNewName -Path $source -Force;
} ElseIf (($date[1].ToDateTime([System.Globalization.CultureInfo]::CurrentCulture)).CompareTo((Get-Date)) -ne 1) {
    Copy-Item -Path $source[1] -Destination $destination -Force;
    Rename-Item -NewName $sourceNewName -Path $source[1] -Force;
} ElseIf (($date[2].ToDateTime([System.Globalization.CultureInfo]::CurrentCulture)).CompareTo((Get-Date)) -ne 1) {
    Copy-Item -Path $source[2] -Destination $destination -Force;
    Rename-Item -NewName $sourceNewName -Path $source[2] -Force;
}
So hier bitte für 3 Daten face-wink

Und hier etwas schöner:
$dataSource = @(
     ("05.04.2016", "C:\sourceFolder\1.txt"),  
     ("06.05.2016", "C:\sourceFolder\2.txt"),  
     ("07.05.2016", "C:\sourceFolder\3.txt")  
);
$destination = "C:\destinationFolder";  
$sourceNewName = "aktuell.txt";  

$dataSource | ForEach-Object {
    If (($_.ToDateTime([System.Globalization.CultureInfo]::CurrentCulture)).CompareTo((Get-Date)) -ne 1) 
    {
        Copy-Item -Path $_[1] -Destination $destination -Force;
        Rename-Item -NewName $sourceNewName -Path $_[1] -Force;
    }
}
Mitglied: Biber
Biber 05.04.2016 aktualisiert um 16:09:52 Uhr
Goto Top
Moin rohu2007,

ich würde eine kleine Textdatei namens "WeeklyImport.txt" anlegen mit sinngemäß diesem Inhalt:

Voraussetzung:
- der geschedulete Batch startet immer an einem der Tage, die in der Liste aufgeführt sind, z.B. immer Sonntags.
- und du weisst, an welchem Sonntag welcher import erwartet wird.

Y:\temp>type WeeklyImport.txt
03.01.2016, "C:\sourceFolder\16.wav"
10.01.2016, "C:\sourceFolder\17.wav"
17.01.2016, "C:\sourceFolder\18.wav"
...

Dann kannst du deinen Bauch reduzieren auf
@echo off & setlocal 
Set "ziel=X:\DestinationFolder\"  

for /f "tokens=1,2 delims=," %%i in (Y:\temp\weeklyImport.txt) do (  
   if "%%i"=="%date%" if exist %%j (  
    copy /y "%%j"  "%Ziel%\aktuell.wav"   
)

Ungetestet, aber hoffentlich von der Strategie her verständlich.

Grüße
Biber
[Edit] Tippfehler, s. Kommentar unten [/Edit]
Mitglied: rohu2007
rohu2007 05.04.2016 um 15:32:01 Uhr
Goto Top
Hallo agowa338

Danke dir für deine Mühe.

Habe es getestet:

$dataSource = @( 

("03.01.2016", "C:\XXX\16.wav"),   
("10.01.2016", "C:\XXX\17.wav"),   
("17.01.2016", "C:\XXX\18.wav"),  
("05.04.2016", "C:\XXX\29.wav")  
); 

$destination = "C:\YYY";   

$sourceNewName = "aktuell.wav";   


$dataSource | ForEach-Object { 

    If (($_.ToDateTime([System.Globalization.CultureInfo]::CurrentCulture)).CompareTo((Get-Date)) -ne 1)  

    { 

        Copy-Item -Path $_[1] -Destination $destination -Force; 

        Rename-Item -NewName $sourceNewName -Path $_[1] -Force; 

    } 

}

Leider funktioniert das nicht.

Kannst du einen Fehler erkennen?
Mitglied: rohu2007
rohu2007 05.04.2016 um 15:39:58 Uhr
Goto Top
Hallo Biber.

Auch deins habe ich getestet:

Datei "Sonntage_2016.txt" angelegt in C:\XXX\

mit dem Inhalt
03.01.2016, "C:\XXX\y\16.wav"   
10.01.2016, "C:\XXX\y\17.wav"   
17.01.2016, "C:\XXX\y\18.wav"  
05.04.2016, "C:\XXX\y\29.wav"  

Die Batch
@echo off & setlocal  

Set Ziel="C:\XXX\aktuell\"   

for /f "tokens=1,2 delims=," %%i in (C:\XXX\Sonntage_2016.txt) do (   

   if "%%i"=="%date% if exist %%j (   

    copy /y "%%j"  "%Ziel%\aktuell.wav"    

)

Leider funktioniert auch das nicht.

Ich weiss auch nicht, wie ich mir den Fehler ausgeben lassen soll, was da nicht stimmt.

Hier dachte ich, fehlt das " hinter dem %date% weil es mit einem " beginnt.
Aber auch das war nicht die Lösung, als ich es damit ergänzt habe.

if "%%i"=="%date%" if exist %%j (   
Mitglied: agowa338
agowa338 05.04.2016 aktualisiert um 15:50:45 Uhr
Goto Top
Welchen Fehler erhälst du?

Zum Anzeigen einfach z. B. ein "timeout /nobreak 2000" in die Letze Zeile schreiben, dann solltest du die Fehlermeldung auch lesen können...
Mitglied: MrCount
Lösung MrCount 05.04.2016 um 16:15:27 Uhr
Goto Top
Also in Zeile 3 sehe ich schon eine Abweichung...

Biber
Set "ziel=X:\DestinationFolder\"   

Deine
Set Ziel="C:\XXX\aktuell\"    

Setze mal die " vorne hin, also
Set "Ziel=......"  
Mitglied: Biber
Lösung Biber 05.04.2016 aktualisiert um 16:24:14 Uhr
Goto Top
Moin rohu2007,

den Grundgedanken meiner Batch hast du offensichtlich verstanden und auch den Tippfehler gefunden.
(habe das von dir gesehene fehlende Anführungszeichen oben ergänzt.)

Außerdem fehlt noch eine schliessende Klammer (einmal muss If-KlammerAuf eine KlammerZu bekommen, einmal auch das DO-KlammerAuf).

Ändere mal deinen Schnipsel so:
@echo off & setlocal  

Set "Ziel=C:\XXX\aktuell\"   

for /f "tokens=1,2 delims=," %%i in (C:\XXX\Sonntage_2016.txt) do (   
  REM zwei Zeilen zum Testen
   if "%%i"=="%date%"  ECHO Gefunden: %date%  
   if exist %%j ECHO Vorhanden  %%j
   if "%%i"=="%date%"   & if exist %%j (   
    ECHO Könnte jetzt tun: copy /y %%j "%Ziel%\aktuell.wav"    
  )
)

Mal schauen, was jetzt passiert.
Später kannst du die ersten beiden Zeilen mit ECHO wieder löschen und die dritte zum Teil.

Grüße
Biber
Mitglied: rohu2007
rohu2007 05.04.2016 um 22:23:49 Uhr
Goto Top
Hallo Biber,

leider funktioniert das immer noch nicht.
Das Fenster ist so schnell wieder zu, ich sehe überhaupt nicht dass da etwas passiert.
Die ECHO haben irgendwie keine Wirkung.

Habe auch, wie von agowa338 empfohlen das angehängt: timeout /nobreak 2000
Das hat aber auch keine Auswirkung.

Liegt das am Betriebssystem?
Ist ein Windows 7 Ultimate, ich habe volle Adminrechte usw.


Danke an euch Alle für eure Hilfe!
Mitglied: Biber
Biber 06.04.2016 aktualisiert um 00:30:15 Uhr
Goto Top
Moin rohu2007,

sorry, zum Testen natürlich den Schnipsel nicht per Doppelclick starten, sondern am CMD-Prompt aufrufen.

Und wenn dann immer noch nix zu sehen ist, der ersten Zeile ein REM voranstellen (damit das ECHO ON bleibt).

Grüße
Biber
Mitglied: rohu2007
rohu2007 06.04.2016 um 20:42:33 Uhr
Goto Top
Hallo Biber,

da klappt etwas nicht.

C:\Users\Server>REM & setlocal

C:\Users\Server>Set Ziel=C:\XXX\
**Syntaxfehler.**
C:\Users\Server>for /f "tokens=1,2 delims=," %i in (C:\XXX\Sonntage_2016.txt)  
C:\Users\Server>

Da kommt ein Syntaxfehler und der do Befehl wird nicht ausgeführt.
Mitglied: Biber
Biber 06.04.2016 um 22:27:59 Uhr
Goto Top
Moin rohu2007,

das ist mir jetzt fast peinlich...

Morgen vormittag bau ich den Batch mal nach und liefere dann eine getestete Variante.

Heute hatte ich leider schon einen klitzekleinen Feierabendtrunk... (oder ~trank? Egal..)
Muss mich deshalb ein bisschen aufs Fahren konzentrieren und kann nicht noch so viel tippen dabei.


Bis morgen
Biber
Mitglied: MrCount
MrCount 07.04.2016 um 07:53:37 Uhr
Goto Top
Ich glaube Biber meinte mit

am CMD-Prompt aufrufen

dass du die Batch dort starten sollst.
Also eher:
C:\Users\Server>deineBatch.bat

Und bei
Set Ziel=C:\XXX\
fehlen (wieder) die Anführungszeichen
Set "Ziel=C:\XXX\"    
Mitglied: rohu2007
rohu2007 08.04.2016 um 13:03:16 Uhr
Goto Top
Hallo MrCount

das mit dem Aufruf mit CMD-Prompt habe ich verstanden.
Habs auch so gemacht.

Das mit den " passiert wenn ich den Code hier reinkopieren.

In der Batch sind diese drin.
Mitglied: MrCount
MrCount 08.04.2016 um 13:11:11 Uhr
Goto Top
Das mit den " passiert wenn ich den Code hier reinkopieren.

In der Batch sind diese drin.

Also wenn ich hier Code (woher auch immer) rein kopiere, dann wird das 1:1 übernommen.
Da wird kein Zeichen mittendrin weggelassen....


Der Syntaxfehler tritt ja offensichtlich direkt nach der Set-Anweisung auf.
Vielleicht postest du mal nen Screenshot von deiner Batch?
Mitglied: rohu2007
rohu2007 08.04.2016 um 13:19:55 Uhr
Goto Top
Hallo MrCount,

im Anhang der Screenshot.

Danke dir.
unbenannt
Mitglied: MrCount
Lösung MrCount 08.04.2016 um 13:26:38 Uhr
Goto Top
1. das
do
sollte in der gleichen Zeile wie das
for
stehen
2. nach dem
do
fehlt die geöffnete Klammer
(

Das ist jetzt das, was ich auf die Schnelle gefunden habe...
Mitglied: rohu2007
rohu2007 08.04.2016 um 13:30:58 Uhr
Goto Top
Ok, habe ich geändert.

Trotzdem kommt nach dem
set "Ziel=...."  
der Syntaxfehler.
Mitglied: MrCount
MrCount 08.04.2016 um 13:49:58 Uhr
Goto Top
Setz auch mal die geöffnete Klammer vom IF in die gleiche Zeile.

@echo off & setlocal

Set "Ziel=C:\tmp\y"  

for /f "tokens=1,2 delims=," %%i in (C:\tmp\Sonntage_2016.txt) do (  

	if "%%i"=="%date%" (  
		echo %%i
	)

)
Mitglied: MrCount
MrCount 08.04.2016 um 13:55:40 Uhr
Goto Top
Die beiden "leeren" IFs kannst du löschen, die sind nutzlos.
Vermutlich bringen die auch einen Syntaxfehler...
Mitglied: rohu2007
rohu2007 08.04.2016 um 13:59:23 Uhr
Goto Top
Welche ifs sind sinnlos?
Was ist mit dem copy befehl wenn heutige datum in der txt vorhanden ist?
Mitglied: MrCount
Lösung MrCount 08.04.2016 um 14:07:21 Uhr
Goto Top
Die "fertige" Batch sieht (bei mir) so aus und funktioniert:

@echo off & setlocal

Set "Ziel=C:\tmp\y"  

for /f "tokens=1,2 delims=," %%i in (C:\tmp\Sonntage_2016.txt) do (  

	if "%%i"=="%date%" (  
		copy /y %%j "%Ziel%\aktuell.wav"  
	)

)
Mitglied: rohu2007
rohu2007 08.04.2016 um 14:34:04 Uhr
Goto Top
Du hast vollkommen Recht!!

Danke dir!

Habe es nun so wie bei dir angepasst und es funktioniert.

Mein Fehler, kenne mich nicht so damit aus.

Danke nochmal für Eure Hilfe!
Mitglied: MrCount
MrCount 08.04.2016 um 14:36:19 Uhr
Goto Top
Wäre nett, wenn du dann noch das Thema als "gelöst", und die hilfreichen Beiträge als "Lösung" markierst.

face-smile
Mitglied: Biber
Biber 08.04.2016 um 15:00:18 Uhr
Goto Top
[OT]
Moin Zahlmeister,

danke für das Einspringen als Schwere-Geburts-Helfer und das Führen des Beitrags zu einem glimpflichen Ende.
Bei mir hat es doch einen Moment länger gedauert, den Rest-Alk vom Mittwoch (und danach heute meinen Posteingangskorb) abzubauen.

War begeistert, dass ja schon alles erledigt ist.
Danke dafür

Grüße und schönes Wochenende allen
Biber
[/OT]