Bra att ha scripts! [Powershell, Batch, Bash...]

Permalänk
Medlem

Bra att ha scripts! [Powershell, Batch, Bash...]

Tänkte att vi i denna tråd delar med oss av scripts som man anser är "bra att ha".

Det kan vara t.ex. Powershell, Batch eller Bash.

Beskriv innan vad syftet är och vad scriptet gör.

Jag börjar.

Jag tänkte uppgradera till Windows 11 & min disk var lite för full. Hade svårt att hitta vart alla prylar låg som tog plats, så jag gjorde detta script i Powershell.
(försökte hitta någon programvara att ladda ner, men hittade ingen)

Detta skript kollar vilka folders som tar mest plats på hårddisken. Jag har exkluderat att ta med Windowsmappen.

Du får sedan en CSV-fil med mappar & dess storlekar. Alla mappar är rangordnade efter storleken på dess innehåll.

Kanske hjälper någon.

Script(Powershell)

# Define a function to format the size in MB or GB function Format-Size { param ( [double]$size ) if ($size -ge 1GB) { return "{0:N2} GB" -f ($size / 1GB) } else { return "{0:N2} MB" -f ($size / 1MB) } } # Function to get folder size function Get-FolderSize { param ( [string]$folderPath ) $size = 0 try { $size = (Get-ChildItem -Path $folderPath -Recurse -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum } catch { Write-Warning "Cannot access folder: $folderPath" } return $size } # Recursive function to get all folders and their sizes function Get-FoldersAndSizes { param ( [string]$basePath ) $folders = @() try { $items = Get-ChildItem -Path $basePath -Directory -ErrorAction SilentlyContinue foreach ($item in $items) { if ($item.FullName -notlike "C:\Windows*") { $folderSize = Get-FolderSize -folderPath $item.FullName $folders += [PSCustomObject]@{ Path = $item.FullName SizeBytes = $folderSize Size = Format-Size $folderSize } $folders += Get-FoldersAndSizes -basePath $item.FullName } } } catch { Write-Warning "Cannot access folder: $basePath" } return $folders } # Get the OS drive $drive = "C:\" # Get all folders and their sizes $folders = Get-FoldersAndSizes -basePath $drive # Sort the results by size in descending order $sortedFolders = $folders | Sort-Object -Property SizeBytes -Descending # Output the results $sortedFolders | Select-Object -Property Path, Size | Format-Table -AutoSize # Export the results to CSV file $sortedFolders | Select-Object -Property Path, Size | Export-Csv -Path "C:\folder_sizes.csv" -NoTypeInformation

Ändra variabeln $drive till den disk du vill kolla.
OBS. Skriptet tar lång tid att köra.

På min 180 Gb disk tog det 15 minuter.

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070

Permalänk
Medlem
Permalänk
Medlem
Permalänk
Hedersmedlem

Fortsätter off topic
WizTree är min favorit. Enormt mycket snabbare än de flesta andra då den läser MFT direkt istället för att låta Windows iterera över allting. 1.1 miljoner filer (154 GB) på min C: tar under 2 sekunder att analysera.

On topic så har jag ett gäng, men alla är så specialiserade att det känns skumt att dela dem.
Har ett Perl-script i min path på alla Linux-burkar som faktiskt kanske är värt att dela dock. Det döper om ett gäng filer med regular expressions (Perl-varianten då). Snarlikt "rename"-kommandot.

Klicka för mer information

#!/usr/bin/env perl # massrename.pl - renames files using regular expressions # Copyright (C) 2008, Thomas Backman <serenity@exscape.org> # Written on 2008-03-12; last modified 2008-03-16 # This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA use strict; use warnings; use Getopt::Std; use constant DEBUG => 0; our $VERSION = "0.2"; $Getopt::Std::STANDARD_HELP_VERSION = 1; # Get command line arguments my %options; getopts("dfpvVh", \%options); sub HELP_MESSAGE { print <<EOF massrename v$VERSION, by Thomas Backman <serenity\@exscape.org> Usage: $0 [options...] <file list> <regex> Valid options: -f Overwrite existing file, if any -d Work on directories as well. By default, only regular files (and symlinks) are renamed. -p Pretend. That is, don't move anything, only display what would be moved without -p active. -v Be verbose (print all old and new filenames) -V, -h Show this help/version screen. Example: $0 *.bak 's/\\.bak\$/.txt/g' EOF ; exit 0; } sub VERSION_MESSAGE { &HELP_MESSAGE } HELP_MESSAGE() unless @ARGV >= 2; HELP_MESSAGE() if ($options{h} or $options{V}); # The regex should be the last argument, so: my $regex = pop @ARGV; # Split the regex. Lets hope it doesn't contain slashes (which isn't *too* common in filenames!) my ($search, $repl, $flags) = ($1, $2, $3) if $regex =~ m{^s/(.*?)/(.*?)/(\w+)?}; $repl = "" unless defined $repl; $flags = "" unless defined $flags; die "Unable to read regex! Make sure it's in the form s/old/new/flags\nFlags are optional, but you might want the /g flag. See man perlre for more info.\nRegex: $regex\n" unless (defined $search && defined $repl); # Walk through the file list and delete all non-files for my $index (0 .. $#ARGV) { $_ = $ARGV[$index]; unless (-f || -l || -d) { warn "$_ doesn't appear to be an existing file, ignoring\n"; if (DEBUG) { print ">>> Deleting $ARGV[$index] from the file list...\n" } delete $ARGV[$index]; } } # Main loop follows, I guess. for my $filename (@ARGV) { my $newname = $filename; # Couldn't get it to work any other way. eval '$newname =~ s/$search/' . "$repl/$flags"; die "Unable to execute substitution! Invalid regular expression?\nError message was: $@\n" if $@; do_move ($filename, $newname) unless $filename eq $newname; # Ignore files whose name didn't change } sub do_move { my ($filename, $newname) = @_; if (-e $newname && !$options{f}) { warn "$newname already exists, not renaming $filename (use -f switch to force)\n"; return } if (-d $filename && !$options{d}) { warn "$filename is a directory, skipping (use -d switch to rename directories as well)\n"; return } # Print names if debugging, pretending (-p) or told to be verbose (-v) if (DEBUG || $options{p} || $options{v}) { print ">>> $filename -> $newname\n"; } return if $options{p}; # Don't actually rename if we're pretending rename $filename, $newname or warn "Unable to rename $filename to $newname: $!\n"; }

Visa mer

Exempel:

$ ls '01 abc def' '02 ghi jkl' $ massrename * 's/(\d+) (.*)/$2 $1/' $ ls 'abc def 01' 'ghi jkl 02'

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Beräkna aspect ratios/skala upplösningar med bibehållen aspect ratio i Bash:

#!/bin/bash export LC_NUMERIC="en_US.UTF-8" if [[ "$1" == "" ]] then echo "Usage: $( basename $0 ) [input Xres] [input Yres] [target Xres or x] [target Yres or x]" echo echo "Example: \$ $( basename $0) 1920 1080 x 720" echo "Result: 1920x1080 (16:9) -> 1280x720 (16:9)" echo echo "Example: \$ $( basename $0) 1280 1024 600 x" echo "Result: 1280x1024 (5:4) -> 600x480 (5:4)" echo echo "Or: $( basename $0 ) [input Xres] [input Yres]" echo echo "Example: \$ $( basename $0) 1680 1050" echo "Result: 1680x1050 (8:5)" echo exit fi function gcd { dividend="$1" divisor="$2" remainder=1 until [ "$remainder" -eq 0 ] do remainder=$(( dividend % divisor )) dividend="$divisor" divisor="$remainder" done echo "$dividend" } if ( echo "$1" | grep -q x ) then inX=$( echo "$1" | sed 's/x.*//' ) inY=$( echo "$1" | sed 's/.*x//' ) targX="$( echo $2 | tr '[:upper:]' '[:lower:]' )" targY="$( echo $3 | tr '[:upper:]' '[:lower:]' )" else inX="$1" inY="$2" targX="$( echo $3 | tr '[:upper:]' '[:lower:]' )" targY="$( echo $4 | tr '[:upper:]' '[:lower:]' )" fi gcd=$( gcd "$inX" "$inY" ) #echo "gcd is $gcd" inarX=$( echo "scale=0; $inX / $gcd" | bc -l ) inarY=$( echo "scale=0; $inY / $gcd" | bc -l ) if [[ "$targX" == "" ]] then echo "$inX"x"$inY" "($inarX:$inarY)" exit fi if [[ "$targX" != "x" && "$targY" != "x" ]] then echo "Either target Xres or target Yres needs to be x" exit fi if [[ "$targX" == "x" && "$targY" == "x" ]] then echo "You need to specify a target X or Y resolution" exit fi if [[ "$targX" != "x" ]] then multiplier=$( echo "$targX / $inX" | bc -l ) targY=$( printf "%.0f\n" $( echo "$inY * $multiplier" | bc -l ) ) else multiplier=$( echo "$targY / $inY" | bc -l ) targX=$( printf "%.0f\n" $( echo "$inX * $multiplier" | bc -l ) ) fi gcd=$( gcd "$targX" "$targY" ) arX=$( echo "scale=0; $targX / $gcd" | bc -l ) arY=$( echo "scale=0; $targY / $gcd" | bc -l ) echo "$inX"x"$inY" "($inarX:$inarY)" "->" "$targX"x"$targY" "($arX:$arY)"

Permalänk
Medlem

För filer finns redan verktyg som TreeSize och AgentRansack för snabb sökning osv, dessa verktyg har funnits i åratal och är tusen gånger effektivare och ger visuell feedback, UI över CLI alltid när det gäller sånt här junk.

Har egentligen inget emot skript om de är bra, finns det verktyg som gör det bättre och snabbare så väljer jag dem 10/10 gånger, har några script-nissar på jobbet som tror de är gurus när de bygger enklare skript som det redan finns verktyg för.

Läsa någon annans skript är som att läsa dålig handstil, går inte få något grepp alls vad som ska ske.

Har för övrigt 10+ skripts som jag kör dagligen på jobbet för att MS inte kan bestämma sig om de ska köra allt via PowerShell eller via deras admin-UI, dessa skript får man modifiera 3-4 gånger per år då MS ändrar i princip allt med inloggning och parametrar att göra.

Permalänk
Medlem

hm tack. konstigt att jag inte fick upp det via mina searches.

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070

Permalänk
Medlem
Skrivet av GuuFi:

För filer finns redan verktyg som TreeSize och AgentRansack för snabb sökning osv, dessa verktyg har funnits i åratal och är tusen gånger effektivare och ger visuell feedback, UI över CLI alltid när det gäller sånt här junk.

Har egentligen inget emot skript om de är bra, finns det verktyg som gör det bättre och snabbare så väljer jag dem 10/10 gånger, har några script-nissar på jobbet som tror de är gurus när de bygger enklare skript som det redan finns verktyg för.

Läsa någon annans skript är som att läsa dålig handstil, går inte få något grepp alls vad som ska ske.

Har för övrigt 10+ skripts som jag kör dagligen på jobbet för att MS inte kan bestämma sig om de ska köra allt via PowerShell eller via deras admin-UI, dessa skript får man modifiera 3-4 gånger per år då MS ändrar i princip allt med inloggning och parametrar att göra.

Ofta finns det ju redan lösningar. Dock kan scripts ibland vara effektivare för ändamålet då dem endast är ämnade (oftast) för att göra en sak. Medans en färdig lösning/programvara gör det du vil men samtidigt typ 200 andra saker.

Sedan ser du ju dessutom exakt vad scriptet gör i koden!

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070

Permalänk
Medlem

Kul tråd!

Använder mig av ett gäng bashskripts för mina ändamål. Ett av dom är att säkerhetskopiera hela systemet genom att kopiera dom till en av mina SSD, som används endast för detta ändanmål. Läs mer på explainshell.com.

#!/bin/bash dir_backup="backup-ssd-dir" sudo rsync -aAXv --progress --delete / --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/home/airikr/Backup/"} "$dir_backup"

Visa signatur

Citera mig om du vill att jag ska hitta till ditt svar.
airikr.me. Andra projekt: Keizai, Koroth & Serenum.

Permalänk
Medlem

@allMessedUp
Ge användaren möjligheten att ange enhet som indata.

Visa signatur

www.fckdrm.com - DRM år 2024? Ha pyttsan.

Permalänk
Medlem

Jag är sen in i matchen men jag såg tråden och tänkte "Dei dära ha ja juh gjort fö hunnra aur seeidaaan" !
Ange om man ska söka efter filer eller mappar. Så kommer den ge storleken på vad som finns eller lista alla filer och avge en liten rapport.

param( [Parameter(Mandatory=$true,Position = 0)][ValidateSet("Folders","Files")]$SearchFor, [Parameter(Mandatory=$true,Position = 1,helpmessage="Path like 'H:\Games\Paks\")]$TopDirectory ) ## Start Modifiable variables $ObjectsToShow = $SearchFor ## "Folders" for showing directories. "Files" for showing files" ## Start conversion size limits (in bytes) $LimitKilobytes = 10480 ## lower than this shows as "Bytes". $LimitMegabytes = 1048000 ## higher than $LimitKilobytes and lower than this shows as "Kilobytes". $LimitGigabytes = 1048000000 ## higher than $LimitMegabytes and lower than this shows as "Megabytes". Above this shows as Gigabytes. ## End conversion size limits ## End Modifiable variables $TodaysDate = Get-Date -Format 'yyyy-MM-dd HH:mm' Write-Host "" Write-Host "Run date: $TodaysDate" Write-Host "" foreach($Directory in $TopDirectory) { ## Start script if($files){Clear-Variable files} if($Directories){Clear-Variable Directories} if($Totalfiles){Clear-Variable Totalfiles} if($TotalDirectories){Clear-Variable TotalDirectories} if($TotalFileSize){Clear-Variable TotalFileSize} $OutPutHash = @{} if( $ObjectsToShow -eq "Folders" ){ $Directories = Get-ChildItem $Directory -Directory $Total = $Directories.Count foreach($Directory in $Directories){ $FileSizeInDirectory = 0 $DirectoryFullName = $Directory.FullName $GetDirectoryFiles = Get-ChildItem $DirectoryFullName -Recurse $FilesInDirectory = $GetDirectoryFiles.count $GetDirectoryFiles | ForEach-Object {$FileSizeInDirectory += $_.length} $Text = "Directory count: " $OutPutHash.Add($DirectoryFullName,$FileSizeInDirectory) } } elseif( $ObjectsToShow -eq "Files" ){ $files = Get-ChildItem -Recurse $Directory -File | select Mode,Directory,Name,Length $Total = $files.Count foreach($file in $files){ $FileName = $file.Name $FileMode = $file.Mode $FileDirectory = $file.Directory $FileFullPath = -join( $FileDirectory.FullName + '\' + $FileName ) $FileSizeBytes = $file.Length $TotalFileSize += $FileSizeBytes $Text = "File count: " $OutPutHash.Add($FileFullPath,$FileSizeBytes) } } $OutPutHash2 = $OutPutHash.GetEnumerator() | sort -Property value -Descending #| select -First 10 | ft -AutoSize foreach($OutPutHashData in $OutPutHash2) { $OutPutHashDataName = $OutPutHashData.Name $OutPutHashDataValue = $OutPutHashData.Value if($OutPutHashDataValue -ge $LimitMegabytes -and $OutPutHashDataValue -lt $LimitGigabytes){ $Size = [math]::Round($OutPutHashDataValue/1MB,2) $SizeSuffix = "Megabyte"} elseif($OutPutHashDataValue -ge $LimitGigabytes){ $Size = [math]::Round($OutPutHashDataValue/1GB,2) $SizeSuffix = "Gigabyte"} elseif($OutPutHashDataValue -ge $LimitKilobytes -and $OutPutHashDataValue -lt $LimitMegabytes){ $Size = [math]::Round($OutPutHashDataValue/1KB,2) $SizeSuffix = "Kilobyte"} elseif($OutPutHashDataValue -lt $LimitKilobytes){ $Size = [math]::Round($OutPutHashDataValue,2) $SizeSuffix = "Bytes "} if($Size.ToString().length -eq 1){$Space = " "} elseif($Size.ToString().length -eq 2){$Space = " "} elseif($Size.ToString().length -eq 3){$Space = " "} elseif($Size.ToString().length -eq 4){$Space = " "} elseif($Size.ToString().length -eq 5){$Space = " "} elseif($Size.ToString().length -eq 6){$Space = " "} elseif($Size.ToString().length -eq 7){$Space = " "} elseif($Size.ToString().length -eq 8){$Space = " "} elseif($Size.ToString().length -eq 9){$Space = " "} else{$Space = " "} Write-Host -ForegroundColor Green "$Size $SizeSuffix" -NoNewline Write-Host -ForegroundColor Red "$Space | " -NoNewline Write-Host "Directory: " -NoNewline Write-Host -ForegroundColor Cyan "$OutPutHashDataName" } Write-host "" Write-host -ForegroundColor Yellow " $Text $Total" if($TotalFileSize -gt 1) { $TotalFileSizeBytes = [math]::Round($TotalFileSize,2) $TotalFileSizeKiloBytes = [math]::Round($TotalFileSize/1KB,2) $TotalFileSizeMegaBytes = [math]::Round($TotalFileSize/1MB,2) $TotalFileSizeGigaBytes = [math]::Round($TotalFileSize/1GB,2) Write-host "" Write-Host " Total file size: " Write-Host " $TotalFileSizeGigaBytes Gigabytes" Write-Host " $TotalFileSizeMegaBytes Megabytes" Write-Host " $TotalFileSizeKiloBytes Kilobytes" Write-Host " $TotalFileSizeBytes bytes" } Write-host "" } ## End script

Dold text

Söka efter mappar:

Söka efter filer:

Visa signatur

🟢 Main: Ryzen7 5800X | Strix x470-I | 32GB | RTX2070S | Samsung C49RG9
🔵 unRaid: Ryzen5 2700X | B450M DS3H | 32GB
🟠 Tfn: Google Pixel 7 Lime Green

-:| @ eller citera för svar |:-