Radera filer med batchkommando?

Permalänk
Medlem

Radera filer med batchkommando?

Hej kamrater.
Efter mycket googlande så har jag kammat noll på den här frågan.
Det är så att jag har ett antal tusen digitalbilder som jag så småningom kommer att processa till nåt slags album, men jag vill för enkelhetens skull inte manuellt sitta och ta bort små bilder.
Min fråga är helt enkelt om det finns ett batchkommando för att göra detta genom en hel kataloghirarki?
Jag har stött på en del märkliga resultat hur man kan göra detta via powershell, men det verkar väldigt krångligt (även om jag skulle vilja lära mig mer om powershell men inte just nu).
Jag är ute efter nåt i stil med "del /as *.* size =< 4096" Men.. Det verkar inte finnas.
Självklart går det att göra genom en sökning i windows explorer, men jag känner att ett snabbhack i cmd skulle vara så mycket snabbare och enklare.
Som vanligt, grymt tacksam för tips

Permalänk
Medlem
Skrivet av medion78:

Hej kamrater.
Efter mycket googlande så har jag kammat noll på den här frågan.
Det är så att jag har ett antal tusen digitalbilder som jag så småningom kommer att processa till nåt slags album, men jag vill för enkelhetens skull inte manuellt sitta och ta bort små bilder.
Min fråga är helt enkelt om det finns ett batchkommando för att göra detta genom en hel kataloghirarki?
Jag har stött på en del märkliga resultat hur man kan göra detta via powershell, men det verkar väldigt krångligt (även om jag skulle vilja lära mig mer om powershell men inte just nu).
Jag är ute efter nåt i stil med "del /as *.* size =< 4096" Men.. Det verkar inte finnas.
Självklart går det att göra genom en sökning i windows explorer, men jag känner att ett snabbhack i cmd skulle vara så mycket snabbare och enklare.
Som vanligt, grymt tacksam för tips

Ok, powershell är nog vägen att gå dessvärre grymt bra för den här typen av batch
https://stackoverflow.com/questions/27897669/powershell-remov...

Permalänk
Medlem

Ok skall ta det steg för steg (det finns mass olika lösningar, vissa kanske är bättre, jag gillar att göra flera rader så jag kan kolla att jag får med rätt grejer=
1. Definera din path
$path = 'E:\Users\Public\Pictures'
2. Ta in alla matchande filer till ett objekt
$files = Get-ChildItem $path -Filter *.jpg -recurse -file | ? {$_.Length -lt 4096}
3. Nu kan de se innehållet i $files genom att bara skriva $files och trycka enter
4. Radera filerna i $files
foreach ($file in $files) {Remove-Item $file | out-null}

Permalänk
Hedersmedlem
Skrivet av Mordekai:

Ok skall ta det steg för steg (det finns mass olika lösningar, vissa kanske är bättre, jag gillar att göra flera rader så jag kan kolla att jag får med rätt grejer=
1. Definera din path
$path = 'E:\Users\Public\Pictures'
2. Ta in alla matchande filer till ett objekt
$files = Get-ChildItem $path -Filter *.jpg -recurse -file | ? {$_.Length -lt 4096}
3. Nu kan de se innehållet i $files genom att bara skriva $files och trycka enter
4. Radera filerna i $files
foreach ($file in $files) {Remove-Item $file | out-null}

Steg 4 borde väl bara kunna bli

$files|Remove-Item

Permalänk
Medlem

Så det finns med andra ord inget enkelt alternativ, utan man måste köra ett skript via powershell? Det känns ju lite galet. Allt jag vill är att radera filer under en viss storlek, inte köra en analys av dem först. Men ok, är det enda vägen att gå så är det väl så. Tack för svar
Edit: Jag antar att det skriptet inte heller kör alla undermappar? Så man måste köra det mapp för mapp? Det vore ju för enkelt annars..

Permalänk
Medlem
Skrivet av medion78:

Så det finns med andra ord inget enkelt alternativ, utan man måste köra ett skript via powershell? Det känns ju lite galet. Allt jag vill är att radera filer under en viss storlek, inte köra en analys av dem först. Men ok, är det enda vägen att gå så är det väl så. Tack för svar
Edit: Jag antar att det skriptet inte heller kör alla undermappar? Så man måste köra det mapp för mapp? Det vore ju för enkelt annars..

Du behöver inte kolla upp vilka filer som kommer att tas bort om du nu inte vill det. Bara att skippa det steget.

Jag kan ju tycka att, när det gäller automatiserad borttagning av mängder med filer, att man kontrollerar så att man inte gjort fel någonstans och tar bort saker man skulle ha velat ha kvar...

Nu har jag inte ägnat mig åt powershell, men jag får ju uppfattningen av skriptet ovan att det går igenom undermappar också.

Permalänk
Medlem
Skrivet av medion78:

Så det finns med andra ord inget enkelt alternativ, utan man måste köra ett skript via powershell? Det känns ju lite galet. Allt jag vill är att radera filer under en viss storlek, inte köra en analys av dem först. Men ok, är det enda vägen att gå så är det väl så. Tack för svar
Edit: Jag antar att det skriptet inte heller kör alla undermappar? Så man måste köra det mapp för mapp? Det vore ju för enkelt annars..

det går att göra allt i en enda rad utan att kolla ett skit och det tar visst med alla undermappar. Powershell är det nya batch-språket i windows bara betydligt kraftfullare.

Get-ChildItem 'E:\Users\Public\Pictures' -Filter *.jpg -recurse -file | ? {$_.length -lt 4096} | % {Remove-Item $_.fullname}

-recurse switchen är den som gör att den även tar med undermappar, kör du batch kör du ju det via cmd.exe, powershell genom powershell.exe så jag förstår inte riktigt din invändning. Snart kommer Microsoft med en ny konsoll för såväl batch som powershell det kanske gör det enklare. Ska du köra script (*.ps1) i powershell kan det ju bli ett steg mer komplicerat eftersom Windows default inte tillåter detta utan du måste själv aktivera möjligheten med executionpolicy;
Exempelvis så här;

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted

Men återigen det finns flera rätta svar
https://docs.microsoft.com/en-us/powershell/module/microsoft....

Permalänk
Medlem
Skrivet av pv2b:

Steg 4 borde väl bara kunna bli

$files|Remove-Item

Absolut men jag är bättre på programmering än script och "piping" så för mig var mitt alternativ enklare och tydligare, effekten är exakt samma både prestandamässigt och vad som raderas.

[Edit]
Eller nja inte hundra, jag kan ha fel på flera sätt här... som sagt inte helt hemma med piping, hade ju använt instansvariabeln $_ men det där kanske fungerar lika bra.

Permalänk
Hedersmedlem
Skrivet av Mordekai:

Absolut men jag är bättre på programmering än script och "piping" så för mig var mitt alternativ enklare och tydligare, effekten är exakt samma både prestandamässigt och vad som raderas.

[Edit]
Eller nja inte hundra, jag kan ha fel på flera sätt här... som sagt inte helt hemma med piping, hade ju använt instansvariabeln $_ men det där kanske fungerar lika bra.

Ja, effekten i vad som raderas är den samma, men mitt sätt är snabbare.

Kolla här:

PS C:\Users\pvz\zzz> $files = 1..1000 | %{new-item -type File -Name $_} PS C:\Users\pvz\zzz> Measure-Command { >> foreach ($file in $files) {Remove-Item $file | out-null} >> } | Select TotalSeconds TotalSeconds ------------ 0,9813465 PS C:\Users\pvz\zzz> $files = 1..1000 | %{new-item -type File -Name $_} PS C:\Users\pvz\zzz> Measure-Command { >> $files | Remove-Item >> } | Select TotalSeconds TotalSeconds ------------ 0,3990681 PS C:\Users\pvz\zzz> $files = 1..1000 | %{new-item -type File -Name $_} PS C:\Users\pvz\zzz> Measure-Command { >> Remove-Item $files >> } | Select TotalSeconds TotalSeconds ------------ 0,8012693 PS C:\Users\pvz\zzz>

Tog även med Remove-Item $files, förväntade mig att detta skulle vara ungefär lika snabbt som $files|Remove-Item men icke!

Testa gärna själv. Jag har bara tagit med en körning här ovan, men jag har kört flera gånger med konsekventa resultat. Mitt testsystem är en Ryzen 5 1600 @ 3,8 GHz och en Samsung 960 Evo 250GB NVMe (formaterad med NTFS) med PowerShell 5.1 på Windows 10 64-bit.

I allmänhet (oavsett programmeringsspråk) är det mycket smartare att när det går skicka in en lista på saker en funktion ska göra, istället för att bara anropa funktionen N gånger. Då kan funktionen optimera hur den jobbar. Tänk dig en robot som kan åka till Ica och handla grejer. Givet en inköpslista, är det mer effektivt att skicka ut roboten en gång för varje grej du vill köpa, eller är det mer effektivt att skicka med inköpslistan med roboten?

Att $files|Remove-Item är snabbare än Remove-Item $files kan jag inte förklara. Men jag antar att Microsoft som skrev Remove-Item bara optimerat den ena anropsmetoden, inte den andra. Oavsett så är båda metoderna snabbare än din loop.

Meningen med det här är så klart inte att kritisera ditt program, det löser ju så klart TS uppgift helt galant! Men jag ville bara belysa att det finns ett enklare, bättre och snabbare sätt.

Permalänk
Medlem
Skrivet av pv2b:

Ja, effekten i vad som raderas är den samma, men mitt sätt är snabbare.

Kolla här:

PS C:\Users\pvz\zzz> $files = 1..1000 | %{new-item -type File -Name $_} PS C:\Users\pvz\zzz> Measure-Command { >> foreach ($file in $files) {Remove-Item $file | out-null} >> } | Select TotalSeconds TotalSeconds ------------ 0,9813465 PS C:\Users\pvz\zzz> $files = 1..1000 | %{new-item -type File -Name $_} PS C:\Users\pvz\zzz> Measure-Command { >> $files | Remove-Item >> } | Select TotalSeconds TotalSeconds ------------ 0,3990681 PS C:\Users\pvz\zzz> $files = 1..1000 | %{new-item -type File -Name $_} PS C:\Users\pvz\zzz> Measure-Command { >> Remove-Item $files >> } | Select TotalSeconds TotalSeconds ------------ 0,8012693 PS C:\Users\pvz\zzz>

Tog även med Remove-Item $files, förväntade mig att detta skulle vara ungefär lika snabbt som $files|Remove-Item men icke!

Testa gärna själv. Jag har bara tagit med en körning här ovan, men jag har kört flera gånger med konsekventa resultat. Mitt testsystem är en Ryzen 5 1600 @ 3,8 GHz och en Samsung 960 Evo 250GB NVMe (formaterad med NTFS) med PowerShell 5.1 på Windows 10 64-bit.

I allmänhet (oavsett programmeringsspråk) är det mycket smartare att när det går skicka in en lista på saker en funktion ska göra, istället för att bara anropa funktionen N gånger. Då kan funktionen optimera hur den jobbar. Tänk dig en robot som kan åka till Ica och handla grejer. Givet en inköpslista, är det mer effektivt att skicka ut roboten en gång för varje grej du vill köpa, eller är det mer effektivt att skicka med inköpslistan med roboten?

Att $files|Remove-Item är snabbare än Remove-Item $files kan jag inte förklara. Men jag antar att Microsoft som skrev Remove-Item bara optimerat den ena anropsmetoden, inte den andra. Oavsett så är båda metoderna snabbare än din loop.

Meningen med det här är så klart inte att kritisera ditt program, det löser ju så klart TS uppgift helt galant! Men jag ville bara belysa att det finns ett enklare, bättre och snabbare sätt.

Jo inte min starka sida, trodde att den gjorde en foreach loop när man pipeade. Min kod är dock lättare debuggable då man kan ha koll på vilken fil som strular. Jag prestandaoptimerar så lite och så sent som möjligt för att kunna pinpointa eventuella problem en errorhandler kan i mitt fall rapportera vilka filer som är skrivskyddad medans en variant där man skickar hela listan helt tappar kontrollen. Så för och nackdelar med båda.

Permalänk
Hedersmedlem
Skrivet av Mordekai:

Jo inte min starka sida, trodde att den gjorde en foreach loop när man pipeade. Min kod är dock lättare debuggable då man kan ha koll på vilken fil som strular. Jag prestandaoptimerar så lite och så sent som möjligt för att kunna pinpointa eventuella problem en errorhandler kan i mitt fall rapportera vilka filer som är skrivskyddad medans en variant där man skickar hela listan helt tappar kontrollen. Så för och nackdelar med båda.

Oavsett vilken metod du använder får du ett felmeddelande när en fil misslyckas som innehåller filnamnet. Fel-output är det samma i båda fallen.