Warum erstellt dieses Powershell-Skript konvertierte Bilder außerhalb des Root-Ordners?

529
bobkush

Das folgende Powershell-Skript soll alle angegebenen Bilder innerhalb des angegebenen Stammordners verarbeiten. Einige der umbenannten Ausgabebilder werden außerhalb des Stammordners generiert. Haben irgendwelche PowerShell-Gurus eine Idee warum? Wie kann ich Dateien nur im Stammordner ausgeben und nicht AUSSERHALB des Stammordners?

  # This script requires ImageMagick # Configuration # Enter the full path of the folder that contains the images $Rootfolder = "C:\temp\rktest"   $Recursive=$true # Change these if necessary $fileExtensions = "*.png" $fileNameSuffix = "_resized" # the text to be appended to the output filename to indicate that it has been modified  $files = $null; $fileCount = 0  # Check if the root folder is a valid folder. If not, try again. if ((Test-Path $RootFolder -PathType 'Container') -eq $false) { Write-Host "'$RootFolder' doesn't seem to be a valid folder. Please try again" -ForegroundColor Red break }  # Get all image files in the folder if ($Recursive) { $files = gci $RootFolder -Filter $fileExtensions -File -Recurse }   # If there are no image files found, write out a message and quit if ($files.Count -lt 1) { Write-Host "No image files with extension '$fileExtensions' were found in the folder '$RootFolder'" -ForegroundColor Red break }  # Loop through each of the files and process it foreach ($image in $files) { $newFilename = $image.DirectoryName + " " + $image.BaseName + $fileNameSuffix + $image.Extension $imageFullname = $image.FullName  write-host "Processing image: $imageFullname" -ForegroundColor Green #This line contains the ImageMagick commands & convert.exe $image.FullName -resize 50% $newFilename  $fileCount++ }  Write-Host "$fileCount images processed" -ForegroundColor Yellow  
1
Was meinst du mit "OUTSIDE"? LotPings vor 5 Jahren 0
Sie zeigen nicht das komplette Skript. Gerard H. Pille vor 5 Jahren 0
Gerald - Ich zeige das komplette Skript - Was fehlt dir? bobkush vor 5 Jahren 0
Ich sehe Unterbrechungsbefehle. Sie sollen eine Schleife verlassen, befinden sich jedoch nicht innerhalb einer Schleife. Ich sehe eine Variable $ Recursive, die niemals gesetzt wird. Gerard H. Pille vor 5 Jahren 0

2 Antworten auf die Frage

1
Gerard H. Pille

Entfernen Sie das Leerzeichen zwischen Verzeichnis und Dateiname und setzen Sie einen umgekehrten Schrägstrich

$newFilename = $image.DirectoryName + "\" + $image.BaseName + $fileNameSuffix + $image.Extension 
Das ist IMO entgegen der Absicht der OP. LotPings vor 5 Jahren 0
Gerald - bitte erkläre den Zweck eines Backslashs anstelle eines Leerzeichens. bobkush vor 5 Jahren 0
Der Zweck besteht darin, die Datei in dem von DirectoryName angegebenen Verzeichnis abzulegen. Kennst du nicht die Bedeutung der Backslashes wie in "C: \ temp \ rktest" ??? Gerard H. Pille vor 5 Jahren 0
Gerald - Danke für die Erklärung. Ihr Vorschlag, die Zeile newFilename vom Leerzeichen zwischen Verzeichnis und Dateiname in einen umgekehrten Schrägstrich zu ändern, BEHEBTE das Problem. Das Skript erstellt jetzt alle OUTPUT-Dateien in demselben Unterordner wie die SOURCE-Images. bobkush vor 5 Jahren 0
In diesem Fall könnten Sie vielleicht meine Antwort akzeptieren? Gerard H. Pille vor 5 Jahren 0
@LotPings, vielen Dank, dass Sie mir die Fehler meiner Wege gezeigt haben. Gerard H. Pille vor 5 Jahren 0
0
LotPings

Wenn ich es richtig verstanden habe, sollten die verkleinerten Bilder eingefügt werden $RootFolder, die Namen der Unterordner sollten jedoch als Teil des Dateinamens beibehalten werden, Leerzeichen getrennt.

Das folgende Skript führt zu diesem Beispielbaum:

> tree /F C:. └───temp └───rktest │ Image.png │ Image_resized.png │ SubDirL1 Image_resized.png │ SubDirL1 SubDirL2 Image_resized.png │ └───SubDirL1 │ Image.png │ └───SubDirL2 Image.png 

Es erstellt eine berechnete Eigenschaft RelPAthmit einer Auswahl und fügt sie der $ -Dateisammlung hinzu.
Dazu wird zuerst der RootFolder aus FullName entfernt und verbleibende Pfadtrennzeichen \durch Leerzeichen ersetzt.

Beim Erstellen des neuen Dateinamens wird die Erweiterung durch das Suffix + Erweiterung ersetzt.

## Q:\Test\2018\06\02\SU_1327985.ps1 # This script requires ImageMagick # Configuration # Enter the full path of the folder that contains the images $Rootfolder = "C:\temp\rktest"  $Recursive=$true # Change these if necessary $fileExtensions = "*.png" $fileNameSuffix = "_resized" # the text to be appended to the output filename to indicate that it has been modified  $files = $null; $fileCount = 0  # Check if the root folder is a valid folder. If not, try again. if ((Test-Path $RootFolder -PathType 'Container') -eq $false) { Write-Host "'$RootFolder' doesn't seem to be a valid folder. Please try again" -ForegroundColor Red break }  # Get all image files in the folder if ($Recursive) { $files = gci $RootFolder -Filter $fileExtensions -File -Recurse | select *,@} }   # If there are no image files found, write out a message and quit if ($files.Count -lt 1) { Write-Host "No image files with extension '$fileExtensions' were found in the folder '$RootFolder'" -ForegroundColor Red break }  # Loop through each of the files and process it foreach ($image in $files) { $newFilename = Join-Path $RootFolder ($image.RelPath.Replace($image.Extension,($fileNameSuffix+$image.Extension))) write-host "Processing image: $($image.Fullname)" -ForegroundColor Green #This line contains the ImageMagick commands & magick convert $image.FullName -resize 50% $newFilename  $fileCount++ }  Write-Host "$fileCount images processed" -ForegroundColor Yellow 

Convert.exe ersetzt magick convertwegen meiner ImageMagick-Version.

Leider kann ich nicht folgen: da in meinem Beispielbaum alle Dateien in $ RootFolder ** und ** in Unterverzeichnissen verarbeitet wurden. Solange der Parameter `-Recurse` im Befehl gci vorhanden ist, sollte er alle Unterverzeichnisse verarbeiten. LotPings vor 5 Jahren 0
Ich habe ** gefragt, was Sie mit AUSSEN meinen und habe keine Antwort bekommen. Ich nahm an, es war Ihre Absicht, sie alle in $ RootFolder zu platzieren und den im Dateinamen vorangestellten Ordnernamen zu enthalten - das ist, was der Code jetzt tut. LotPings vor 5 Jahren 0
Nicht oberste Ebene wäre das root. Sie sollten besser erklärt haben, wo Sie sie an erster Stelle haben möchten. LotPings vor 5 Jahren 0
LotPings - Vielen Dank für Ihre Anweisungen. Ihr Skript funktioniert perfekt, wenn Sie die OUTPUT-Dateien im Ordner der obersten Ebene ablegen. Es tut mir leid, wenn meine Frage es schwer machte zu verstehen, was ich wollte - aber zwischen Ihnen und Gerald habe ich jetzt ein Skript, das ALLE Ausgabedateien im Ordner TOP erstellen kann, und ein Skript, das ALLE Ausgabedateien im selben Unterordner als erstellen kann die Quellbilder. bobkush vor 5 Jahren 0