batlerner
Goto Top

Batch Erstelldatum Datei auslesen

Hallo,
ich bin gerade am Anfang der Batch programmierung und habe ein Problem in meinem Programm.

Ich will Dateien eines Zeitraums,der 3 Tage nicht überschreitet in einen Ordner verschieben. (Dateinamen sind nicht bekannt)
Der Ordner-Name soll am Ende das erste und das letzte Datum beinhalten. Ich habe aber ein Problem mit dem speichern des Datums.
Kann mir hier vielleicht jemand behilflich sein?


@echo off
setlocal enabledelayedexpansion


set /a monat[1]=0
set /a monat[2]=31
set /a monat[3]=59
set /a monat[4]=90
set /a monat[5]=120
set /a monat[6]=151
set /a monat[7]=181
set /a monat[8]=212
set /a monat[9]=243
set /a monat[10]=273
set /a monat[11]=303
set /a monat[12]=333


echo 1.Ordner 100MSDF
set /a k=0

set /a day=0
set /a month=0
set /a year=0

set /a tageAnfang=0
set /a tageEnde=0
set /a tageTmp=0

set /a tagAnfang=0
set /a MonatAnfang=0
set /a tagEnde=0
set /a MonatEnde=0

md #

for /f "delims=" %%A IN ('dir /b /OD "*.txt"') do (  
	set dat=%%~tA
	set /a day=1!dat:~0,2!-100
	set /a month=1!dat:~3,2!-100

	if %k%==0 (
		
		set /a tagAnfang=!dat:~0,2!
		set /a monatAnfang=!dat:~3,2!
		set /a year=!dat:~6,4!
		
		set /a tageAnfang=monat[%month%]+%day%
		set /a tageEnde=%tageAnfang%
		rem Datei verschieben in #
		move %%A #
	) else (
		set /a tageTmp=month[%month%]+%day%
		
		REM auf 3 Tage differenz prüfen!
		if %tageTmp% LEQ %tageEnde%+"3" (  
		%tageEnde%=%tageTmp%
		set /a tagEnde=!dat:~0,2!
		set /a MonatEnde=!dat:~3,2!
		rem Datei verschieben in #
		move %%A #
		) else (
		echo größer als 3 Tage
		pause
		goto jump
		)
	)
	set /a k=%k%+1
)

:jump
set /p UserEingabe=Ordnername:
rename # %year%#%tagAnfang%.%MonatAnfang%-%TagEnde%.%MonatEnde%_%UserEingabe%

Habe es auch schon so versucht, bin aber auch gescheitert....
for /f "tokens=1-3 delims=. " %%i in ('dir *.txt /t:c^|findstr /i /l "%%A"') do (...)  


Würde mich über Tipps freuen.

Gruß Batlerner


PS: Der Fehler mit dem Schaltjahr ist vernachlässigbar, sowie dass über den Jahreswechsel Dateien angelegt werden.

Content-Key: 445821

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

Printed on: April 27, 2024 at 16:04 o'clock

Member: rubberman
rubberman Apr 28, 2019 updated at 17:05:31 (UTC)
Goto Top
Batch ist für den Kram blöd. Es gibt keinen DateTime Typ und das Datumsformat ist von lokalen Einstellungen abhängig. Außerdem verstehe ich deine Anforderungen nicht.
Teste mal, was dir das Script ausspuckt und ob du es als Basis nutzen kannst.
@echo off &setlocal DisableDelayedExpansion

set "n=3" &REM 3 tage zurück  
for /f "tokens=1-3 delims=. " %%j in ("%date:* =%") do set /a "DD=100+(D=1%%j %% 100), MM=100+(M=1%%k %% 100), YYYY=%%l"  
for /l %%i in (1 1 %n%) do set /A "M0=!(D-=1),MM=100+(M-=M0*(1-12*(Y0=!(M-1)))),YYYY-=M0*Y0,DD=100+(D+=M0*(30+((M+(M>>3))&1)-!(M-2)*(2-(!(YYYY&3)&(!!(YYYY%%25)|!(YYYY&15))))))"  
set "past=%YYYY%%MM:~-2%%DD:~-2%"  

for %%i in (*.txt) do (
  set "fname=%%~fi"  
  for /f "tokens=1-3 delims=. " %%j in ("%%~ti") do set "fdate=%%l%%k%%j"  
  setlocal EnableDelayedExpansion
  if "!fdate!" lss "!past!" (  
    echo !fdate! ^<  !past!
    echo !fname!
  ) else (
    echo !fdate! ^>= !past!
    echo !fname!
  )

  echo ~~~~~~~~~~~~~~~~
  endlocal
)
pause
Wenn du das Datum nicht als Wert brauchen würdest, wäre FORFILES natürlich sinnvoller ...
Steffen
Member: Crusher79
Crusher79 Apr 28, 2019 updated at 21:14:43 (UTC)
Goto Top
Hi,

ich weiß, wird hier ewig wierderholt - Batch ist tot! Verschieben nach Kriterien ist mit PowerShell kein Thema!

Dein Datumsproblem kann man mit ein paar Zeilen sofort lösen!

Du bekommst heir 2x Variablen raus. Die kann man später einfach so an Ordnernamen dran hängen. First und Last liefern exakt dein Ergebnis. Ist vor allem auch viel übersichtlicher.

Das Umbenennen des Ordners, bzw. richtige anlegen hab ich mal übersprunge. Da ich nciht weiß, ob du überhaupt PS willst.

Hier ist noch die Besonderheit das Datum auf Mitternacht gesetzt wird und 3 Std. abgezogen werden. Da hier eine Sicherung um 22 Uhr staffindet, die adneren um 1 Uhr.

Du siehst aber, mit PS ist es kein Problem!

ACHTUNG: NUR BEISPIEL - KEINE KOMPLETTE LÖSUNG !!!

$SourceFolder="F:\meine_dateien"  
$DestinationFolder = "F:\aktuelle_auswahl\"  
$x = $ArchivName.length + 11  
$heute = (Get-Date -Hour 0 -Minute 00 -Second 00 ).AddHours(-3).ToString('MM\/dd\/yyyy HH:mm:ss')  

Get-ChildItem $SourceFolder | Where-Object {-not $_.PSIsContainer  -and $_.LastWriteTime -gt $heute } | 
Sort-Object LastWriteTime | Select-Object FullName, BaseName, Extension | Foreach-Object {

$IncludeFiles = $_.BaseName

    $DestinationFileName = $_.BaseName+$_.Extension    
    $DestinationFullFileName = $DestinationFolder+$DestinationFileName

    Move-Item -Path $_.FullName -Destination $DestinationFullFileName    
} 

Hier mal nur ein paar Zeilen die Dein First/ Last Problem auf anhieb lösen würden.....

Get-ChildItem -Path $DestinationFolder -Recurse | Sort-Object -Property LastWritTime | Select LastWriteTime -First 1 | Foreach-Object {
 $first = $_.LastWriteTime 
 Write-Host $first
 }
Get-ChildItem -Path $DestinationFolder -Recurse | Sort-Object -Property LastWritTime | Select LastWriteTime -Last 1 | Foreach-Object { 
 $last = $_.LastWriteTime 
 Write-Host $last
 }