Rename funktioniert nicht (Batch)?
Also ich habe .bmp Dateien und möchte gerne, dass sie die Endung .png bekommen, aber irgendwie funktioniert es nicht zumindest nicht bei meinem Konstrukt. Wenn ich das in dem jeweiligen Ordner mache funktioniert es. Ich möchte aber, dass es auch mit meinem jetzigen Skript funktioniert. Die bat Datei ist außerhalb und ich möchte, das dieser Befehl im Screenshots Ordner ausgeführt wird.
4 Antworten
Ok, du hast erstmal das problem selbst gelöst...👍
Mir erschließt sich jedoch nicht der Sinn einer Umbennenung zu .png. Dies ändert nicht das Format der Bilddateien, sondern lediglich die Extension. Es bleiben BMPs, nur das sie jetzt ein falsch Benennung haben.
Einzig der Umstand, das die meisten Bildbetrachter sich nicht für die Dateiendung interessieren verhindert Fehlermeldungen.
Hier ei kleiner Powershell Einzeiler der eine echte Formatwandlung nach PNG durchführt.
powershell $f=gi 'system\*.bmp' ;Add-Type -AssemblyName System.Drawing;$f^|%%{$D='{0}\{1}.png' -f $_.Directory,$_.BaseName;$i=new-object System.Drawing.Bitmap $_.Fullname;$i.save($D,[Drawing.Imaging.ImageFormat]::PNG)}
Bitte Beachten: statt Pfade mit "DoubleQuotes" anzugeben verwende verwende 'SingleQuotes' ! (dies ist ein Zugeständnis an die Einfachheit das Scripts)
Du kannst sogar mehere QuellDateien/-Ordner und/oder Quellformate durch Komma getrennt angeben.
powershell $f=gi 'system\*.bmp','system\*.jpg','system 2\*.jpg','*.tiff' ;Add-Type -AssemblyName System.Drawing;$f^|%%{$D='{0}\{1}.png' -f $_.Directory,$_.BaseName;$i=new-object System.Drawing.Bitmap $_.Fullname;$i.save($D,[Drawing.Imaging.ImageFormat]::PNG)}
hier das verwendete PowershellScript in lesbarer Version:
Add-Type -AssemblyName System.Drawing
$file=Get-Item '*.bmp'
$file|ForEach{
$Zielldatei='{0}\{1}.png' -f $_.Directory,$_.BaseName
$Image = new-object System.Drawing.Bitmap $_.Fullname
$Image.Save($Zielldatei,[Drawing.Imaging.ImageFormat]::PNG)
}
dies ist nur die lesbare form de Einzeilers:
convertToPNG.ps1:
#Bildverbeitungsbibliothek der .NET-Runtime einbinden
Add-Type -AssemblyName System.Drawing
#alle Dateien mit dem angegebenen Muster einlesen
$file=Get-Item '*.bmp'
#für alle eingelesenen Dateien mache:
$file|ForEach{
#Tausche die Endung für die Zieldatei zu .png
$Zielldatei='{0}\{1}.png' -f $_.Directory,$_.BaseName
#lade die EingabeBilddatei mit ihrem vollen Namen in die Variable $Image
$Image = new-object System.Drawing.Bitmap $_.Fullname
#speichere die Bilddatei unter dem Namen Zieldatei (mit der Endung .png) im Bildformat PNG
$Image.Save($Zielldatei,[Drawing.Imaging.ImageFormat]::PNG)
}
da man für Powershell mehrere Zeilen durch Semikolon getrennt in einer Zeile unterbringen kann tue ich dies. und kann damit ein komplettes Powershellscript mit einem Batchaufruf abarbeiten.
demo.cmd
@echo off
rem wie gehabt copy oder move :
copy /-y "System\shot*.bmp" "ScreenShots\"
Konvertierungsscript als Einzeiler aufrufen (auf alle bmp-Dateienim angegebenen Ordner anwenden)
powershell $f=gi 'ScreenShots\*.bmp' ;Add-Type -AssemblyName System.Drawing;$f^|%%{$D='{0}\{1}.png' -f $_.Directory,$_.BaseName;$i=new-object System.Drawing.Bitmap $_.Fullname;$i.save($D,[Drawing.Imaging.ImageFormat]::PNG)}
rem zum löschen der bmp-dateien entferne das rem vor dem del... (wenn alles wie gewünscht funktioniert)
rem del /q *.bmp
pause
exit /b
Der Befehl "Konvertierungsscript" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
gi : Der Pfad "E:\SWAT\SWAT 4\SEF\Screenshots\Screenshots" kann nicht gefunden werden, da er nicht vorhanden ist.
In Zeile:1 Zeichen:4
+ $f=gi 'Screenshots\*.bmp' ;Add-Type -AssemblyName System.Drawing;$f|% ...
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (E:\SWAT\SWAT 4\...ots\Screenshots:String) [Get-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand
ok ich habe das rem vor einem Kommentar vergessen... rem Konvertierungsscript...
...das sollte Batchproger selbst erkennen können...😏
wo kommt den plötzlich der volle Pfad min Swat her?
die Batch arbeitet bis her nur mit relativen Pfaden
Bei mir arbeitet der Einzeiler perfekt.
du musst doch nichts weiter tun als den Einzeiler statt deines rename einzufügen, genauso dafür habe ich ihn gebaut.
Ich habe echt Angst davor dir heute Abend die sache mit dem Zeitstempel zu zeigen...
Ich denke mal das Dein gesamtes Projekt maßlos über deine Fähigkeiten geht... 😱🥶
poste einfach was du bisher hast und ich versuche das ganze mal in eine sinnvolle Ordnung zu bringen...
Ja, das Projekt geht echt über meine Fähigkeiten.
@echo off
title SEF Screenshots folder script
color 0F
echo Just run it every time you want to have all your screenshots in the "Screenshots" folder in the SEF folder.
echo All screenshots are converted to .png format to make it easier to share the screenshots, for example on Discord.
md "Screenshots" 2>nul
if not exist "system\*.bmp" goto :notFound
move /-y "System\shot*.bmp" "Screenshots\"
pause
cd Screenshots
ren *.bmp *.png
pause
exit /b
:notFound
if not exist "System" (
echo "%~f0" ...
echo ..."%cd%" ...
) else (
echo Cannot find images in the "System" folder!
)
pause >NUL
Komisch bei mir funktioniert es einwandfrei. Es gibt drei Gründe wieso ich .png haben möchte:
- kann man nur umständlich .bmp Dateien auf Discord teilen (man muss sie jedes mal herunterladen und dann anschauen)
- .png hat den Vorteil das weniger Speicherplatz für die gleiche Qualität verwendet wird.
- .png ist einer der häufigsten Formate.
Komisch bei mir funktioniert es einwandfrei
Genau das meinte ich mit:
Einzig der Umstand, das die meisten Bildbetrachter sich nicht für die Dateiendung interessieren verhindert Fehlermeldungen.
Es wird die Endung getauscht. Diskort scheint sich lediglich dafür zu interessieren welche Endung die hochgeladene Datei hat (und dem Browser schein die Endung bei der Darstellung egal zu sein.) Möglich das die ohnehin eine interne Anpassung vornehmen.
Mein Converter interessiert sich ja auch nicht für das Format des Eingabematerials.
Wenn Du mit meinem Script oder einem anderen Bildkonverter die Dateien nach der Konvertierung nur noch einen Bruchteil der vorherigen Größe haben.
dann welchse in der batch doch noch den ordner!? o_O
"cd" (change directory) bevor du das rename ausführst!?
Ok, hat sich erledigt. Ich habe es in einer anderen falschen Schreibweise getan. Danke.
Dann Pack einfach ein
cd Screenshots
vor den rename-Aufruf.
Ok, hat sich erledigt. Ich habe es in einer anderen falschen Schreibweise getan.
Dann gibst du den Namen des Verzeichnisses an, in dem du die Dateien umbenennen willst.
Außerdem benötigst du je nach Umgebung, in die du die Dateien verschiebst, eine Wartezeit bevor du sie automatisch umbenennen kannst.
Pfade würde ich auch nicht in die Funktionen schreiben sondern am Anfang der batch als Variablen definieren.
Ich verstehe das Skript nicht bitte mit Kommentaren versehen, damit ich jeden Schritt nachvollziehen kann.