Rename funktioniert nicht (Batch)?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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)
}
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
LukasvondorLade 
Fragesteller
 25.07.2020, 16:21

Komisch bei mir funktioniert es einwandfrei. Es gibt drei Gründe wieso ich .png haben möchte:

  1. kann man nur umständlich .bmp Dateien auf Discord teilen (man muss sie jedes mal herunterladen und dann anschauen)
  2. .png hat den Vorteil das weniger Speicherplatz für die gleiche Qualität verwendet wird.
  3. .png ist einer der häufigsten Formate.
0
Erzesel  25.07.2020, 16:58
@LukasvondorLade
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.

0
LukasvondorLade 
Fragesteller
 25.07.2020, 16:44

Ich verstehe das Skript nicht bitte mit Kommentaren versehen, damit ich jeden Schritt nachvollziehen kann.

0
Erzesel  25.07.2020, 17:29
@LukasvondorLade

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
0
LukasvondorLade 
Fragesteller
 25.07.2020, 17:42
@Erzesel

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

0
Erzesel  25.07.2020, 18:22
@LukasvondorLade

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...

0
LukasvondorLade 
Fragesteller
 25.07.2020, 18:36
@Erzesel

@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

0

dann welchse in der batch doch noch den ordner!? o_O

"cd" (change directory) bevor du das rename ausführst!?

Woher ich das weiß:Hobby – Programmierer, EDV, ... seit den 80er :)
LukasvondorLade 
Fragesteller
 24.07.2020, 23:30

Ok, hat sich erledigt. Ich habe es in einer anderen falschen Schreibweise getan. Danke.

0

Dann Pack einfach ein

cd Screenshots

vor den rename-Aufruf.

LukasvondorLade 
Fragesteller
 24.07.2020, 23:29

Ok, hat sich erledigt. Ich habe es in einer anderen falschen Schreibweise getan.

0

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.