Abstand bei Pfad-Variable in batch-Skript?

jmar83

Member
Was muss ich tun bei dSource ?

Bringt nix:

  1. set dSource=„G:\Meine Ablage\git-backup“
oder

  1. set dSource=G:\Meine Ablage\git-backup
    for /f „delims=“ %%f in (‚dir /a-d-h-s /b /s „%dSource%“‘) do (
@Echo on
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day365
set /a strip=day
7
set dSource=G:\Meine Ablage\git-backup

call :epoch %date%
set /a slice=epoch-strip

for /f „delims=“ %%f in (‚dir /a-d-h-s /b /s %dSource%‘) do (
call :epoch %%~tf
rem if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
if !epoch! LEQ %slice% del /f %%f
)
exit /b 0


rem Args[1]: Year-Month-Day
:epoch
setlocal ENABLEDELAYEDEXPANSION
for /f „tokens=1,2,3 delims=-“ %%d in (‚echo %1‘) do set Years=%%d& set Months=%%e& set Days=%%f
if „!Months:~0,1!“==„0“ set Months=!Months:~1,1!
if „!Days:~0,1!“==„0“ set Days=!Days:~1,1!
set /a Days=Daysday
set /a _months=0
set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m
day&& set /a i+=1)
set /a Months=!_months!
set /a Years=(Years-1970)*year
set /a Epoch=Years+Months+Days
endlocal& set Epoch=%Epoch%
exit /b 0
 

jmar83

Member
Wieder nix:



G:








cd \

cd "Meine Ablage"

cd git-backup







call :epoch %date%

set /a slice=epoch-strip




for /f "delims=" %%f in ('dir /a-d-h-s /b /s .') do (

call :epoch %%~tf

rem if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

if !epoch! LEQ %slice% del /f %%f

)

exit /b 0





Dito:



G:

cd \

cd "Meine Ablage"

cd git-backup







call :epoch %date%

set /a slice=epoch-strip




for /f "delims=" %%f in ('dir /a-d-h-s /b /s @path') do (

call :epoch %%~tf

rem if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

if !epoch! LEQ %slice% del /f %%f

)

exit /b 0
 

jmar83

Member
Klappt auch nicht, jedenfalls sind nach dem Ausführen noch immer 8 Dateien drin:



C:

cd \

cd Tools

cd git-backup

@Echo off

setlocal

set sourceDir=C:\_GIT

set zipFile=git-backup-%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%.zip

echo Add-Type -A System.IO.Compression.FileSystem >> %~dp0TempZipScript.ps1

echo [IO.Compression.ZipFile]::CreateFromDirectory('%sourceDir%','%~dp0%zipFile%') >> %~dp0TempZipScript.ps1

PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dp0TempZipScript.ps1'"

del %~dp0TempZipScript.ps1

move *.zip "G:\Meine Ablage\git-backup"

cd "G:\Meine Ablage\git-backup"




rem J.M., 2019-12-24 {

for /f "usebackq delims=" %%G in (

`forfiles /c "cmd /c if /i @isdir == true echo @path" /d 7 2^>nul`

) do echo del "%%~G"

rem } J.M., 2019-12-24




rem C:\Tools\git-backup\clean.bat




setlocal

endlocal & exit /b
 

jmar83

Member
Das Auslegen in der Schleife ist nicht das Problem, beim "set" kann (muss?) man auf die Anführungszeichen verzichten, dafür aber dann in Kriterium für die for-Schleife diese schreiben:


for /f „delims=“ %%f in (‚dir /a-d-h-s /b /s "%dSource%"‘) do (

...das scheint soweit zu klappen, hat aber zur folge dass die "Elemente" der einelnen Iterationen wieder String ohne Anführungszeichen sind.
 

GwenDragon

Registered User
Logisch das es bei set geht, das ist eine Zuweisung, bei der der Parameter bis Zeilenende geht, keine Pfadauflösung.
 

GwenDragon

Registered User
Wenn du die Quelle deines Batch nennst, könnte dir jemand besser helfen. Ich habe keine Zeit mehr, mich durch das Copy&Paste deines merkwürdig formatierten Batch zu wühlen. Viel Erfolg noch.
 

danton

Debian User
Schon mal einfach per echo die Variable ausgegeben, um zu schauen ob sie korrekt gefültt ist? Nicht dass dein Problem an einer anderen Stelle liegt...
 

DeaD_EyE

Blog Benutzer
Python:
"""
Dateien rekursiv zu löschen.
"""

import sys
import time
from datetime import datetime as dt
from pathlib import Path
from argparse import ArgumentParser


def delete_files(root: Path, extensions: list, max_age: int, st: str, delete: bool) -> None:
    now = time.time()
    for ext in extensions:
        for file in root.rglob(f'*.{ext}'):
            try:
                file_ts = getattr(file.stat(), st)
            except FileNotFoundError:
                continue
            diff = (now - file_ts) / 3600 / 24
            if diff > max_age:
                file_ts = dt.fromtimestamp(file_ts)
                print(file_ts, file, sep='\t')
                if delete:
                    try:
                        file.unlink()
                    except Exception as e:
                        print(e, sys.stderr)


if __name__ == '__main__':
    parser = ArgumentParser(description=__doc__)
    parser.add_argument('root', type=Path, help='Verzeichnis dessen Dateien gelöscht werden sollen')
    parser.add_argument('--extensions', default=['*'], nargs='+', help='Dateierweiterungen')
    parser.add_argument('--max-age', type=int, default=7, help='Maximales Alter in Tagen')
    parser.add_argument('--st', default='st_ctime', choices=['st_atime', 'st_mtime', 'st_ctime'], help='Zugriffszeit, Modifizierungszeit, Erstellungszeit')
    parser.add_argument('--delete', action='store_true')
    args = parser.parse_args()
    delete_files(**vars(args))
Müsste funktionieren :-D
Python 3 wird benötigt. Wenn du das in PowerShell haben möchtest, lernst du am besten die Sprache.
Copy & Paste ist immer Mist. Eigentlich sollte man das in der Schule vermittelt bekommen, aber ich habe das Gefühl es ist genau umgekehrt.
 
Top