Skript zum Kopieren funktioniert nur teilweise?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Bist Du Dir sicher, dass das Änderungsdatum aller Dateien nicht älter ist als das mit /d: angegebene Datum. Das heist bei dieser Batch, Dateien welche vor dem aktuellen Tag datiert sind werden ignoriert.

Möglicherweise sind die einige Dateien von anderen Anwendungen geöffnet? dann wird der Zugriff verweigert.

Ich kann das von Dir geschilderte Verhalten nicht nachvollziehen. Bei mir macht die Batch exakt was sie soll. (das nächste Mal den Code bitte als Text in die Codebox</> kopieren. Screenshots abtippen macht keinen Spaß🤮)

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
DomeLPs 
Fragesteller
 10.05.2024, 02:52

Erstmal vielen vielen Dank für deine Antwort

Manchmal sieht man den Wald vor lauter Bäumen nicht du hast vollkommen recht aus irgendeinem Grund haben manche Dateien trotz Bearbeitung am heutigen Tag nicht das heutige Datum ich habe diesen Eintrag entfernt und werde jetzt Befehls Fenster gefragt ob ich Dateien überschreiben möchte oder nicht

Und sorry noch mal für den Screenshot da ich auf dem aktuellen Gerät gerade keine Möglichkeit hatte auf gutefrage zu gehen hatte ich die Wahl auf Handy abschreiben oder abfotografieren

1
DomeLPs 
Fragesteller
 10.05.2024, 12:47

Danke Noch mal ich habe jetzt einen Zusatz angehängt welcher die Kopien nach 7 Tage wieder löscht

forfiles /P "C:\temp" /d /m *.* /d -7 /c "cmd /c del @path"

Leider löscht er nicht nur in dem Sicherungsverzeichnis alte Ordner sondern auch Datein in neuem Ordner welche älter sind mir fällt kein Script ein welche nur die Ordner z.B "01-05-2024" löscht jedoch nicht Inhalte älteren Datums in Ordner welche jünger sind als 7 Tage

0
Erzesel  10.05.2024, 19:13
@DomeLPs

Die Herumrötelei mit Forfiles war schon immer gruselig.

Ich mach mir auch nicht die Mühe den alten Gaul Batch weiter zu reiten, wenn ich was besseres habe. (Meine masochistische Phase hab ich hinter mir)

Windows hat mit Powershell ein tolles Werkzeug an Bord.

Die ganze Aktion inklusive des gezielten Löschens alter Ordner bekommt man mit ein par Zeilen gebacken:

Demo_short.ps1
$BkUpFolderName = 'BkUp-{0}'-f $(Get-Date -Format 'yyyy-MM-dd')
$DesinationBase = "$Env:UserProfile\Desktop\BackupZiel"
 #kopiere Ordner samt kompletem Inhalt
cp "E:\Test" "$DesinationBase\$BkUpFolderName"-r -cont -Force
 #mindestens 7 tage alte Ordner mit dem Muster "BkUp-*" im BackupZiel löschen 
gci $DesinationBase -dir -fi 'BkUp-*'|?{$_.LastWriteTime -le (Get-Date).AddDays(-7)}|rm -r -force

ok... 😣 die Sache mit den Alias-Kürzeln ist eher was für schnell-schnell

hier noch mal die ganze Show zum Ausprobieren. Es werden zum Testen auch gleich ein Paar künstlich gealterte Ordner erstellt, damit man nicht 7 Tage warten muss 🥱😴.

Full_Demo.ps1

# der Name sollte sortierbar sein,  das  heist,  was  am seltensten wechselt muss als  erstes im string enthalten  sein!
#du kannst dir natürlich  den Namen zusammenbasteln  wie du möchtest aber so herum wird die Identifikation Der Ordner beim späteren Löschen einfacher
$BkUpFolderName = 'BkUp-{0}'-f  $(Get-Date -Format 'yyyy-MM-dd')
$DesinationBase = "$Env:UserProfile\Desktop\BackupZiel"


$From = "E:\Test"
$To = "$DesinationBase\$BkUpFolderName"


#kopiere Ordner samt kompletem Inhalt
Copy-Item $From $To -Recurse -Container -Force -Passthru




#mal ganz  willkürlich noch  ein paar testordner mit  gleichm Namensmuster ins Ziel basteln
Write-Host  erstelle 20 alte Demoordner
-1..-20|
    ForEach-Object {
        $NewFolderDateTime = (Get-Date).AddDays($_)
        $FolderName = '{0}\BkUp-{1}'-f  $DesinationBase , $(Get-Date $NewFolderDateTime -Format 'yyyy-MM-dd')
        $CreatedFolder = New-Item $FolderName -ItemType Directory -Force
        $CreatedFolder #mal anzeigen
        $CreatedFolder.LastWriteTime = $NewFolderDateTime  #Ordneralter  ändern
        Write-Host $($_.Name) gealtert: $($CreatedFolder.LastWriteTime.DateTime)-fo green
    }


#jetzt holen wir uns alle Ordner die  dem Muster BkUp-irgenwas'entsprechen
Get-ChildItem $DesinationBase -Directory -Filter 'BkUp-*'|
    Where-Object {$_.LastWriteTime -le (Get-Date).AddDays(-7)}|  #kleinergleich Heute -7Tage sind
    ForEach-Object {
        Write-Host Ordner: $($_.Name) ist mindestens 7 Tage alt  -ForeGround red
        Remove-Item $_.FullName -Recurse -Force  #löschen
    } 

pause

viel Spaß...

0
DomeLPs 
Fragesteller
 11.05.2024, 00:44
@Erzesel

Ja sehr Richtig nur leider ist dieses kräftige neue Pferd von Windows fest in seiner Box verschlossen Windows blockiert die ausführung sofort mit

.\Beispiel.ps1 : Die Datei "C:\Beispiel.ps1" kann nicht geladen werden, da die Ausführung von Skripts auf
diesem System deaktiviert ist. Weitere Informationen finden Sie unter "about_Execution_Policies"
(https:/go.microsoft.com/fwlink/?LinkID=135170).
In Zeile:1 Zeichen:1
+ .\skript.ps1
+ ~~~~~~~~~~~~~~~
    + CategoryInfo          : Sicherheitsfehler: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

Ich könnte es ja um gehen mit

set-executionpolicy remotesigned

Allerdings würde dies dann ein Sicherheits Risiko darstellen eine ausnahme zu erstellen Funktioniert leider auch nicht mit dem mir bekannten Befehl

powershell -ep RemoteSigned -file beispiel.ps1

Daher lässt Windows mich diesen Befehl nicht ausführen

0
Erzesel  11.05.2024, 08:47
@DomeLPs

Das mit den Sicherheitskriterien ist seit Windows Vista/7 eigentlich nicht mehr Zeitgemäß, da die UAC auch bei Administratorkonten standardmäßig Programme nur mit Nutzerrechten ausführt. Diese Sicherung war vorher dazu gedacht um schädliche Scripte nicht ungesehen mit Admin ausführen zu können. Allerdings ist das so Sicher als würde man den Schlüssel außen im Schloss stecken lassen.

Heute hält das bestenfalls noch "Oma Meier" davon ab "aus versehen" eine .ps1 auszuführen.

Und was Bösewichte angeht, so scheren die sich ohnehin nicht um dergleichen🥱

naja... und wenn Du eine Exe-Datei mit Doppelklick startest weißt Du auch nicht was sie tut. Bei einem unbekannte Powerschellscript kannst Du wenigsten nachschauen was drin ist.

  • Normalerweise startet man ein Powershell mit Rechtsklick auf die .ps1-Datei ...ausführen mit Powershell.
  • Oder man startet die Powershellconsole und gibt die Zeilen ein. Was natürlich heißt, man kann auch ein ganzes Script per Copy&Paste einfügen [CTRL+V] .
  • oder mit der offiziellen Commandozeile :
powershell -ExecutionPolicy Bypass -File "meinScript.ps1"

...Das ändert nicht die Powershell-Richtlinie des ganzen Systems sondern nur für den ausführenden Prozess.

...und auch folgendes geht. Eine Batch-Datei:

Posh_Hybrid_Demo.cmd

<# : Batch Abschnitt ,Batch sieht in dieser Zeile die Eingabe aus der Datei # an ein SprungLabel, Powershell sieht den begin eines Kommentars. 
:: akzeptiert UTF8 ohne BOM gespeicherte Scripte
start "" powershell  "iex (gc '%~f0' -Encoding UTF8 -Raw| out-string)" 
exit /b
:: Hier endet die Batch  und für Powershell ein Kommentar #>

#hier kann beliebiger PowershellCode angehängt werden
Write-Host "Hallöchen ich bin ein PowerschellScript"  -ForeGround green
pause

.., das ding schert sich nicht im geringsten um die Policies

0
DomeLPs 
Fragesteller
 11.05.2024, 12:51
@Erzesel

Und genau da wird es Komisch Windows verweigert es dennoch sowohl nach dem Bypass als auch über die Batch er führt den Script nur aus bei

set-executionpolicy remotesigned

Dieses verhalten ist definitiv nicht ganz normal eventuell hat mein Windows einen weg mir bleibt wohl keine andere Wahl als den genannten Befehl zu nutzen wenn du der Meinung bist das dies heute Unbedenklich ist kann man dies wohl so tun

Und eventuell muss da mal Windows neu kommen

Ich Danke dir nochmal vom Ganzen herzen bin etwas eingerostet mein Schwerpunkt liegt bei Hardware

1