Skript zum Kopieren funktioniert nur teilweise?
Ich habe folgendes Script sehe Bild geschrieben um ein paar Dateien regelmäßig zum backupen einfach Doppelklick auf die Datei am Desktop und Ruhe ist jetzt habe ich folgendes Problem aus irgendwelchen Gründen werden manche Sachen kopiert und manche nicht ich verstehe persönlich gerade nicht ganz warum die meisten Dateien werden schön brav in einen Ordner nach Datum abgelegt manche Dateien jedoch nicht z.b verpackte Dateien werden komplett ignoriert
1 Antwort
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ß🤮)
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
- https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell.management/copy-item?view=powershell-5.1
- https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell.management/new-item?view=powershell-5.1
- https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell.utility/get-date?view=powershell-5.1
- https://devblogs.microsoft.com/scripting/adding-and-subtracting-dates-with-powershell/
- https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-5.1#format-operator--f
viel Spaß...
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
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
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
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
Danke Noch mal ich habe jetzt einen Zusatz angehängt welcher die Kopien nach 7 Tage wieder löscht
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