• This forum has a zero tolerance policy regarding spam. If you register here to publish advertising, your user account will be deleted without further questions.

Abstand bei Pfad-Variable in batch-Skript?

J

jmar83

Guest
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
 
-> Das Forum tut obenstehende Anführungszeichen etc. nach unten!!
 
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
 
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
 
OK, vielen Dank! ;-)

Evtl. war's das andere Forum, vom dem ich copy/paste gemacht habe...
 
Allgemein: Variablen und Pfade sollten in " " stehen, damit ein Leerzeichen nicht als Trenner benutzt wird.
 
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.
 
Logisch das es bei set geht, das ist eine Zuweisung, bei der der Parameter bis Zeilenende geht, keine Pfadauflösung.
 
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.
 
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...
 
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.
 
Back
Top