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

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

Member: bastla
bastla Apr 04, 2016 updated at 21:28:11 (UTC)
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
Member: agowa338
agowa338 Apr 04, 2016, updated at Apr 05, 2016 at 11:51:59 (UTC)
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;
}
Member: rohu2007
rohu2007 Apr 05, 2016 at 05:18:07 (UTC)
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?
Member: MrCount
MrCount Apr 05, 2016 at 05:51:55 (UTC)
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
Member: rohu2007
rohu2007 Apr 05, 2016 at 06:30:45 (UTC)
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!
Member: MrCount
MrCount Apr 05, 2016 at 07:37:14 (UTC)
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
Member: rohu2007
rohu2007 Apr 05, 2016 at 08:07:44 (UTC)
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"  
Member: agowa338
agowa338 Apr 05, 2016 updated at 12:20:22 (UTC)
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;
    }
}
Member: Biber
Biber Apr 05, 2016 updated at 14:09:52 (UTC)
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]
Member: rohu2007
rohu2007 Apr 05, 2016 at 13:32:01 (UTC)
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?
Member: rohu2007
rohu2007 Apr 05, 2016 at 13:39:58 (UTC)
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 (   
Member: agowa338
agowa338 Apr 05, 2016 updated at 13:50:45 (UTC)
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...
Member: MrCount
Solution MrCount Apr 05, 2016 at 14:15:27 (UTC)
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=......"  
Member: Biber
Solution Biber Apr 05, 2016 updated at 14:24:14 (UTC)
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
Member: rohu2007
rohu2007 Apr 05, 2016 at 20:23:49 (UTC)
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!
Member: Biber
Biber Apr 05, 2016 updated at 22:30:15 (UTC)
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
Member: rohu2007
rohu2007 Apr 06, 2016 at 18:42:33 (UTC)
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.
Member: Biber
Biber Apr 06, 2016 at 20:27:59 (UTC)
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
Member: MrCount
MrCount Apr 07, 2016 at 05:53:37 (UTC)
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\"    
Member: rohu2007
rohu2007 Apr 08, 2016 at 11:03:16 (UTC)
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.
Member: MrCount
MrCount Apr 08, 2016 at 11:11:11 (UTC)
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?
Member: rohu2007
rohu2007 Apr 08, 2016 at 11:19:55 (UTC)
Goto Top
Hallo MrCount,

im Anhang der Screenshot.

Danke dir.
unbenannt
Member: MrCount
Solution MrCount Apr 08, 2016 at 11:26:38 (UTC)
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...
Member: rohu2007
rohu2007 Apr 08, 2016 at 11:30:58 (UTC)
Goto Top
Ok, habe ich geändert.

Trotzdem kommt nach dem
set "Ziel=...."  
der Syntaxfehler.
Member: MrCount
MrCount Apr 08, 2016 at 11:49:58 (UTC)
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
	)

)
Member: MrCount
MrCount Apr 08, 2016 at 11:55:40 (UTC)
Goto Top
Die beiden "leeren" IFs kannst du löschen, die sind nutzlos.
Vermutlich bringen die auch einen Syntaxfehler...
Member: rohu2007
rohu2007 Apr 08, 2016 at 11:59:23 (UTC)
Goto Top
Welche ifs sind sinnlos?
Was ist mit dem copy befehl wenn heutige datum in der txt vorhanden ist?
Member: MrCount
Solution MrCount Apr 08, 2016 at 12:07:21 (UTC)
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"  
	)

)
Member: rohu2007
rohu2007 Apr 08, 2016 at 12:34:04 (UTC)
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!
Member: MrCount
MrCount Apr 08, 2016 at 12:36:19 (UTC)
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
Member: Biber
Biber Apr 08, 2016 at 13:00:18 (UTC)
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]