Ich schrieb das folgende Skript, um die Dateien in einem Ordner auf Batch-Prozess basierte auf dem Titel des Magazins (alles vor dem ersten Bindestrich):Verschieben von Dateien in Ordnern mit Powershell und RegEx
magazine title - year-month.pdf
zB National Geographic - 2017-07.pdf
Nach dem Ausführen des Skripts werden die Magazine aus dem übergeordneten Ordner in einen neuen Unterordner verschoben, in diesem Fall "National Geographic Magazine".
Drei ähnliche Fragen:
Der ‚_Orphans‘ Ordner (Zeile 38) erzeugt, auch wenn es keine "Waisen für eine spätere manuelle Bearbeitung, um es in Datei in. Wie mache ich den Ordner Erstellung bedingt?
Doppelte Dateien erzeugen während der Verarbeitung eine Fehlermeldung. Keine große Sache, da das Skript weiterhin ausgeführt wird, aber ich würde gerne mit Duplikaten genauso verfahren, wie 'Waisen' behandelt werden, mit einem neuen Ordner "_Duplicates"/move.
Wie kann ich mehrere Zeilen ohne die # am Anfang jeder Zeile kommentieren (zum Beispiel am Anfang des Skripts). Es muss eine elegantere Möglichkeit geben, Kommentare/Dokumentation zu behandeln ...?
Bonus Frage:
Wenn Sie sind wirklich langweilig für die Multi-TB Dateikopie warten Sie Fortschritte wie eine Stunde Glas anschauen, könnte jemand helfen mit dem Code für eine Reihe von Trennzeichen (falscher Begriff/Name wahrscheinlich) wie in Zeile 10 gezeigt? Ich würde mögen in der Lage sein, mehr als nur den hart-kodierten Bindestrich anzugeben, den ich in meinem regex Match verwendete (Linie 26, die mich den besseren Teil eines Tages nahm, um zu arbeiten).
$OrigFolder = ".\"
$NewFolder = ".\_Sorted to Move"
# Orphans folder, where files that return null in the regex match will be moved
# Example: file "- title.pdf"
# will be moved to ".\_Orphans" folder
$Orphans = '_Orphans' # Use the underscore to sort the folder to the top of the window
#### How to use an array of values for the delimiters in the regex instead of literals
#### My proposed code, but I am missing how to use the delims in the regex match
#### $delims = "\s-\s" ",\s"\s and\s"
# First count the number of files in the $OrigFolder directory
$numFiles = (Get-ChildItem -Path $OrigFolder).Count
$i=0
# Tell the user what will happen
clear-host;
Write-Host 'This script will copy ' $numFiles ' files from ' $OrigFolder ' to _Sorted to Move'
# Ask user to confirm the copy operation
Read-host -prompt 'Press enter to start copying the files'
# Regex to match filenames
$Regex = [regex]"(?:(.*?)\s-)|(?:(.*?),\s)|(?:(.*?)\sand\s)"
# Loop through the $OrigFolder directory, skipping folders
Get-ChildItem -LiteralPath $OrigFolder | Where-Object {!$_.PsIsContainer} |
ForEach-Object {
if($_.BaseName -match $Regex){
$ChildPath = $_.BaseName -replace $Regex
#Caluclate copy operation progress as a percentage
[int]$percent = $i/$numFiles * 100
# If first part of the file name is empty, move it to the '_Orphans' folder
if(!$Matches[1]){
$ChildPath = $Orphans}
else {
$ChildPath = $Matches[1]
}
# Generate new folder name
$FolderName = Join-Path -Path $NewFolder -ChildPath ($ChildPath + ' Magazine')
# Create folder if it doesn't exist
if(!(Test-Path -LiteralPath $FolderName -PathType Container)){
$null = New-Item -Path $FolderName -ItemType Directory}
# Log progress to the screen
Write-Host "$($_.FullName) -> $FolderName"
# Move the file to the folder
Move-Item -LiteralPath $_.FullName -Destination $FolderName
# Tell the user how much has been moved
Write-Progress -Activity "Copying ... ($percent %)" -status $_ -PercentComplete $percent -verbose
$i++
}
}
Write-Host 'Total number of files in '$OrigFolder ' is ' $numFiles
Write-Host 'Total number of files copied to '$NewFolder ' is ' $i
Read-host -prompt "Press enter to complete..."
clear-host;
mehrzeilige Kommentare können in '<#' '#>' '' '' '' # Ihr Multiline-Kommentar hier #> 'gewickelt werden –