Alten Namen löschen + Datum und Uhrzeit als Dateiname? (Batch)?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Gleich mit bezugnehmend auf das laufende Projekt ( https://www.gutefrage.net/frage/rename-funktioniert-nicht-batch#answer-360511444) :

Da ich ohnehin schon in der Konvertierungsroutine eine Datei schreibe ist es mir natürlich völlig Wurst wohin ich diese Schreibe und wie ich den Namen der Datei gestalte. Innerhalb des HilfsSripts in Powershell macht es dann auch nur eine Zeile aus das Ziel zu justieren.

Da ich die Datei nun direkt in einen Zielordner scheibe wird copy, move, rename übeflüssig.

Letztlich bleibt am Ende nur die Frage ob man die Original.BMP-Dateien behält oder löscht.

In der Powershell-Zeile musst Du nichts mehr verändern. Die vertänderlichen Parameter habe ich an den Anfang der Batch in die BatchVariablen : %__search%, %__destinationFolder% und %__injekt% gelegt.

Als Zielordner kannst Du ebenso gut einen absoluten Pfad angeben:

set "__destinationFolder=%temp%\Desktop"
::oder
set "__destinationFolder=f:\irgendwo"

dann werden die konvertierten Dateien auch in die angegebenen Zielordner geschrieben

Die Batch habe ich in allen nur denkbaren Umgebungen getestet, es ist völlig egal in welchem Ordner es ausgeführt wird oder welchen Namen Du der Batch gibst, es tut was es soll.

convertScreenShots.cmd

@echo off
title SEF Screenshots folder script
  rem sicherstellen Arbeitsverzeichnis ist da wo die Batch  sich befindet (hoffentlich im Ordner \SEF ?)   
cd /d "%~dp0"
  rem Suchordner und Suchmuster hier  festlegen
set  "__search=system\*.bmp"
  rem Zielordner,  wo  die konvertierten Dateien hinsollen. (absoluter Pfad oder relativer pfad) kein Backslasch  am Ende....
set "__destinationFolder=Screenshots"
  rem wenn du die folgende Zeile löscht (oder  rem davor setzt) gibt das Powershellscript keine  Statusmeldung aus!
set "__injekt='File written: '+$dst"  


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 "%__destinationFolder%" 2>nul
if not exist "%__search%" goto :notFound


  rem das Powerschellscript   Convertiert   di  BMP  nach PNG  und  legt die PPNG- dateien automatisch  im  Zielordner  ab. 
  rem   Move  und Rename etc. sind  nicht mehr  nötig
  rem  das Script  funktioniert! nichts  daran  verändern! nur  über obige Variablen %__search% , %__destinationFolder% und %__injekt% steuern
powershell  $file=Get-Item '%__search%'; Add-Type -AssemblyName System.Drawing;$file^|ForEach{$DF='%__destinationFolder%';$dst='{0}\{1}-{2}.png' -f $DF,$_.CreationTime.toString('yyyyMMddHHmmssffff'),$_.BaseName;$I = new-object System.Drawing.Bitmap $_.Fullname;$I.Save($dst,[Drawing.Imaging.ImageFormat]::PNG);%__injekt%};

echo  Delete original Screenshot Files?
choice 
if %errorlevel% equ 1 (
      rem Ich lösche nie in TestScripten,  Zum Scharfmachen echo vor  dem del  entfernen..
    echo del /q "%__search%"
)

pause
exit /b
:notFound
if not exist "System" (
    echo "%~f0" ...
    echo ..."%cd%" ...
) else (
    echo Cannot find images in the "%cd%\System" !
)
pause

die Powershellzeile nochmal in lesbarer Form:

Add-Type -AssemblyName System.Drawing

$file=Get-Item 'Pfad\suchMuster*'; 
$file|ForEach{
    $DestinationFolder='PfadZielordner';
       # .CreationTime.toString('yyyyMMddHHmmssffff') legt eine nutzerspezifische Formatierung eines DatumObjekts  fest.  
    $DestinationFile='{0}\{1}-{2}.png' -f $DestinationFolder,$_.CreationTime.toString('yyyyMMddHHmmssffff'),$_.BaseName;
    $Image = new-object System.Drawing.Bitmap $_.Fullname;
    $Image.Save($DestinationFile,[Drawing.Imaging.ImageFormat]::PNG);
};

Damit nicht irgendein Gejammer hinsichtlich viel "Rot" von Powershell kommt:

Bild zum Beitrag

Du kannst deine Ordner Swat ,Swat 4 , SEF auch HalloKitty oder Schneewitchen nennen es macht der Batch nichts aus.

  • ...ach so... wollen wir noch über das Honorar reden... die batch get ja klammheimlich in Dein geistiges Eigentum über... 🤔...alles gut🤣
  • solange Du es nicht in einer Bat2Exe versteckst ist alles kannst damit machen was du möchtest.

...so...und jetzt muss mein Mopie k💩💩💩

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
 - (Technik, Windows, programmieren)
LukasvondorLade 
Fragesteller
 26.07.2020, 17:58
Just run it every time you want to have all your screenshots in the "Screenshots" folder in the SEF folder.
All screenshots are converted to .png format to make it easier to share the screenshots, for example on Discord.
new-object : Ausnahme beim Aufrufen von ".ctor" mit 1 Argument(en):  "Ungültiger Parameter."
In Zeile:1 Zeichen:196
+ ... $_.BaseName;$I = new-object System.Drawing.Bitmap $_.Fullname;$I.Save ...
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In Zeile:1 Zeichen:241
+ ...  $_.Fullname;$I.Save($dst,[Drawing.Imaging.ImageFormat]::PNG);'File w ...
+                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull


File written: Screenshots\202007261751339332-shot0001.png
 Delete original Screenshot Files?
[J,N]?


0
Erzesel  26.07.2020, 19:46
@LukasvondorLade

es erscheint mir 2020 zwar fast unmöglich, aber arbeitest Du mit Windows 7 oder älter?

.unter windows 10 ist standardmäßig .Net-Framework 4.8 installiert.

Der Fehler tritt eigentlich nur auf, wenn (aus welchen Gründen auch immer) der Constructor eines Objects nicht aufgerufen werden kann.

Hast Du die Möglichkeit das Script auf einem anderen (Win 10) Rechner zu testen?

0
LukasvondorLade 
Fragesteller
 26.07.2020, 20:16
@Erzesel

Ich arbeite mit Windows 10 auf dem aktuellsten Stand sogar Windows 2009 also die 20H2 Version.

0
Erzesel  26.07.2020, 20:17
@LukasvondorLade

Ich habe gerad mal etwas total Abwegiges geteste. Ich habe einfach ine Textdatei ,Leerdatei erzeugt ud bmp benannt. Mit dem Inhalt kann Die Routine natürlich nichts anfangen!

Ich habe mien Testbild in JPG ,Gif,PNG,Tiff konvertiert (mit Irfanview) und zu bmp umbenannt. Die Dateiendung is meinem Script egal. (mit dem Webp-Format kann mein Script nichts anfangen.)

Also wenn Du schon Testest verwende eine echte Bilddatei! ...und keine irgendwasDatei, welche Du BMP nennst.

Du wirst doch irgendeine Bildatei haben, die auch angezeigt wird?

...der fehler tritt auf wenn die Eingabedatei kein Bild enthält.

0
Erzesel  26.07.2020, 20:24
@LukasvondorLade
File written: Screenshots\202007261954154767-EE ava.gif.png
File written: Screenshots\202007260208369421-shot0001.png
File written: Screenshots\202007260208369461-shot0002.png
File written: Screenshots\202007260209391728-shot0003.png
File written: Screenshots\202007260209391798-shot0004.png
File written: Screenshots\202007262008541395-test.jpg.png
File written: Screenshots\202007262005002594-test.png.png
new-object : Ausnahme beim Aufrufen von ".ctor" mit 1 Argument(en):  "Ungültiger Parameter."
In Zeile:1 Zeichen:196
+ ... $_.BaseName;$I = new-object System.Drawing.Bitmap $_.Fullname;$I.Save ...
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand


File written: Screenshots\202007262021311646-test.txt.png
new-object : Ausnahme beim Aufrufen von ".ctor" mit 1 Argument(en):  "Ungültiger Parameter."
In Zeile:1 Zeichen:196
+ ... $_.BaseName;$I = new-object System.Drawing.Bitmap $_.Fullname;$I.Save ...
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand


File written: Screenshots\202007262003415310-tet.webp.png
 Delete original Screenshot Files?
[J,N]?

..genau das löst bei mier den Fehler aus...

0
LukasvondorLade 
Fragesteller
 26.07.2020, 20:30
@Erzesel
Just run it every time you want to have all your screenshots in the "Screenshots" folder in the SEF folder.
All screenshots are converted to .png format to make it easier to share the screenshots, for example on Discord.
File written: Screenshots\202007262020533545-Shot00000.png
new-object : Ausnahme beim Aufrufen von ".ctor" mit 1 Argument(en):  "Ungültiger Parameter."
In Zeile:1 Zeichen:196
+ ... $_.BaseName;$I = new-object System.Drawing.Bitmap $_.Fullname;$I.Save ...
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand


File written: Screenshots\202007261751339332-shot0001.png
 Delete original Screenshot Files?
[J,N]?

Also es hat jetzt funktioniert, allerdings gefallen mir die Zahlen vorne nicht. Ich finde es nicht schlimm, wenn kein Datum und Zeit vorne ist, aber es sollte wenigstens eine Nummerierung vorne sichtbar sein, also das shot0001 usw. Fehlermeldung kommt trotzdem. Und das löschen funktioniert nicht. Datum/Uhrzeit hat den Vorteil das man gut die wichtigsten Daten sehen kann und das die Dateien nicht überschrieben werden, wenn der Dateiname gleich ist. Im Systemordner werden nämlich immer wieder von vorne gezählt also shot000 wenn dort keine anderen shot Dateien sind. Also mir geht es nur darum das die Dateien nicht überschrieben werden indem sie nicht den gleichen Namen haben und eine Nummerierung haben.
0
Erzesel  26.07.2020, 20:52
@LukasvondorLade
Dann ist shot0001.bmp noch immer keine Echte Bilddatei.

was das datumsformat angeht, kannst du durchaus damit spielen :

('yyyyMMddHHmmssffff') bedeutet 4Stelliges Jahr , 2St. Monat 2St Tag.. 2Stunden usw ffff sind Millisekunde (probiere doch einfach 1 oder 2 stellen für Jahr, reicht schon mal für 10 /100jahre die Sekunden/Millisekunden sind auch her theoretischer Natur

und natürlich funktioniert das löschen nicht! Wer lesen kann is klar im Vorteil:

rem Ich lösche nie in TestScripten,  Zum Scharfmachen echo vor  dem del  entfernen..

ich setze immer in Testscripten ein Echo vor zerstörende Befehle. Damit wird angezeigt was passieren Würde...

Der Rechner eines Fragestellers ist nicht der meine... damit liegt es in der Verantwortung des Fragestellers einen Zerstörenden Befehl "scharf" zu machen... das ist mein Splint an der Handgranate...

0
LukasvondorLade 
Fragesteller
 26.07.2020, 23:27
@Erzesel

Ich kann lesen mir ist aber gerade aufgefallen das ich dabei das del mit entfernt habe.

0
LukasvondorLade 
Fragesteller
 26.07.2020, 18:10

"...ach so... wollen wir noch über das Honorar reden... die batch get ja klammheimlich in Dein geistiges Eigentum über... 🤔...alles gut🤣"

Wenn man etwas freiwillig macht, dann aus dem Herzen heraus. Naja klammheimlich muss nicht sein. Wenn du willst kann ich dich in den Credits erwähnen das ist kein Problem für mich.

0

PWolf hat sich bereits redlich abgestrampelt...

Einen Zeitstempel mit Batch zu Basteln ist wahrlich keine Anfängeraufgabe.

Ich mache jetzt weder ein rename noch beziehe ich mich auf Dein Projekt.

Solange Du nicht Abläufe selbst nachvollziehen kannst kann Dir niemand wirklich helfen. Bisher hast Du mehr oder weniger abgeschrieben und mit ach und krach ein paar einfache Dateioperationen gelernt. (das ist keine Kritik, für ein Paar Tage ist das ganz normaler Lernfortschritt und total ok)

Eigentlich solltest Du Dein Projekt bei seit legen und einfach mal ein paar Probedateien anlegen und ein paar kleine Demo Batches schreiben, bei denn du die Grondlagen erlernst... Alles andere ist wertlos...

...und wenn Du Dir von den Helfern Stück für Stück Deine Batch schreiben lässt ist es nicht mehr Dein Werk und du weißt natürlich nicht wirklich wie es abläuft.

Wie auch PWolf komme ich nicht umhin Daten aus anderen Programmen mit for/f-Loops zu filtern und Variablen zuzuweisen. Das bringt es auch mit sich, das wir mit verzögerter Expansion arbeiten müssen. Das ist selbst für die meisten Fortgeschrittenen erstmal harter Toback.

der befehl um den Millisekundengenauen Zeitstempel eier Datei abzurufen wäre zB.

wmic datafile where name='C:\\Users\\Erzesel Secure\\Desktop\\demo.txt' get CreationDate

beachte die Verdopplung de Backslash!

TimeStamp_demo.cmd

@echo off
  rem ohne verzögerte Expansion  würde  es höllisch!!!
setlocal enableDelayedExpansion


  rem erzeuge ein  paar Probierdateien bei denen  Du nichts  kaput machen kannst 
for /l %%a in (1000,1,1010) do (
    echo Text %%a >"Tstfile%%a.blubb"
      rem  es  wird tatsächlich  nötig eine  kleine   warteschleife  einzubauen, da bei einer  SSD innerhalb einer Microsekund  mehrere Dateien  erstellt werden können
    for /l %%. in (1,1,20000) do rem
)


  rem nur mal zu demo nichts  umbenenen ...nur möglichen  zeitstempel  für Dateien im aktuellen  ordner anzeigen
for %%a in (*.blubb) do (
      rem vollen Namen  in variable speichern
    set "__filename=%%~fa"
      rem Backslash für WMIC verdoppeln  !__filename:\=\\!
      rem wmic datafile where name='!__filename:\=\\!' get CreationDate,Status
    for /f "usebackq skip=2 tokens=2,3 delims=,.+ " %%f in (`"wmic datafile where name='!__filename:\=\\!' get CreationDate,Status /format:csv 2>nul"`) do ( 
        echo original Datei: %%~fa
        
          rem Der  Zeitstempel ist auf die Millisekunde genau! 
        echo Zielname waere: %%f%%g-%%~na.neueEndung
        echo:
     )
)


pause

solche Monster sind dann auch der Grund weshalb Programmierer bei aller liebe zu Bach , dan doch Powershell die Arbeit machen lassen.

@echo off
powershell Get-ChildItem  *.blubb ^|%%{ 'original Datei: {0}' -f $_.FullName;'Zielname waere: {0}-{1}.neueRndung' -f ($_.CreationTime).toString('yyyyMMddHHmmssffff'),$_.BaseName;''}
pause

das soll nicht bedeuten, das man jetzt besser alles in Powershell schreiben sollte. PowershellScripte unterliegen sehr harten Sicherheitsbeschränkungen, welch sich eben nur in Verbindung mit Batch umschiffen lassen.

Komplexe Scripte lassen sich nur schwer in einer Zeile unterbringen. Es gibt zwar Tricks wie ich jedes Script an den Ausführungsbeschränkungen vorbeimogle, aber dann brennt Dir garantiert die "Lampe" durch und du bekommt eine schöne neue Jacke... (mit sehr langen Ärmeln)

Übrigens die Batch mit dem convertscript ist in arbeit, ich baue dan auch gleich den Zeitstempel ein...

...aber Lernen wie es funktioniert sollst du trotzdem...

kleiner tipp: ::@echo off oder echo on ist manchmal sehr nützlich um zu sehen was passiert... auch in Schleifen kan man eine Pause schreiben...

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
LukasvondorLade 
Fragesteller
 25.07.2020, 23:48

Also ich würde schon ganz gerne das Projekt beenden, auch wenn mit viel Hilfe. Ich habe vor danach mich mit einfacheren und kleineren Projekten zu beschäftigen. Und ja ich habe mich schon über Powershell informiert, das Problem ist halt das man eine Powershell Datei schwieriger ausführen kann aufgrund der Sicherheit, aber eigentlich ist Powershell die Zukunft zumindest ist es von Microsoft so gewollt. Man muss aber auch sagen das .bat Dateien eigentlich nur für das eigene Netzwerk gedacht sind und nicht um es unbedingt Leuten anzubieten.

Wie sieht es eigentlich aus mit Python? Kann man da das Gleiche machen in Form einer .exe? Ich habe nämlich gelesen das Python Batch ziemlich ähnlich sein soll.

0

Welches Datum? Das Dateierstellungdatum? Oder das aktuelle???

Woher ich das weiß:Studium / Ausbildung – Informatikstudent
LukasvondorLade 
Fragesteller
 25.07.2020, 16:42

Dateierstellungsdatum

0
LukasvondorLade 
Fragesteller
 25.07.2020, 17:14
@whgoffline

Das soll ein .bat Skript erledigen und kein zusätzliches Programm, weil es viel zu umständlich ist, das Programm extra herunterzuladen und auszuführen.

0
LukasvondorLade 
Fragesteller
 25.07.2020, 17:27
@whgoffline

Als Alternative kann auch statt Datum und Uhrzeit im Dateinamen auch eine Nummer verwendet werden die von 0 bis 10.000.

0

Das Folgende berücksichtigt, dass du in einem Kommentar geschrieben hast, dass du das Erstellungsdatum benötigst.

Mit Beibehaltung des alten Namens (hab ich ausprobiert):

for %# in (*) do @(for /F " usebackq tokens=1-5 delims=.: " %A in (`dir /tc "%#" ^| findstr /B /V /C:" "`) do @ren "%#" "%C-%B-%A %D.%E %#")

Ohne Beibehaltung des alten Namens:

for %# in (*) do @(for /F " usebackq tokens=1-5 delims=.: " %A in (`dir /tc "%#" ^| findstr /B /V /C:" "`) do @ren "%#" "%C-%B-%A %D.%E")

(Hier fehlt nur das %# am Ende)

-----

Wenn du auch die Sekundenangabe benötigst, wird es komplizierter, hier müsste man vermutlich FORFILES verwenden.

Woher ich das weiß:eigene Erfahrung
LukasvondorLade 
Fragesteller
 25.07.2020, 17:49

echo off

cd Screenshots

for %# in (*) do @(for /F " usebackq tokens=1-5 delims=.: " %A in (`dir /tc "%#" ^| findstr /B /V /C:" "`) do @ren "%#" "%C-%B-%A %D.%E")

pause

exit /b

Bei mir hat es keine Auswirkung.

0
PWolff  25.07.2020, 17:51
@LukasvondorLade

Sorry, hab vergessen, dass in einer Batch-Datei die Prozentzeichen verdoppelt werden müssen:

for %%# in (*) do @(for /F " usebackq tokens=1-5 delims=.: " %%A in (`dir /tc "%%#" ^| findstr /B /V /C:" "`) do @ren "%%#" "%%C-%%B-%%A %%D.%%E")

Liefert übrigens das Zeitformat

JJJJ-MM-TT hh:mm

Vorteil: alphabetische und zeitliche Sortierung stimmen überein

0
LukasvondorLade 
Fragesteller
 25.07.2020, 17:54
@PWolff

Bei mir ist kein hh:mm sondern hh.mm und das Problem ist das jetzt alle Dateien keine .png und .bmp Endung haben und somit unbrauchbar sind.

0
PWolff  25.07.2020, 17:55
@LukasvondorLade

Stimmt. Sorry, hab vergessen: der Doppelpunkt ist als Bestandteil eines Namens nicht zulässig, deshalb hatte ich ihn durch einen Punkt ersetzt.

Für die Dateiendung:

for %# in (*) do @(for /F " usebackq tokens=1-5 delims=.: " %A in (`dir /tc "%#" ^| findstr /B /V /C:" "`) do @ren "%#" "%C-%B-%A %D.%E%~x#")
0
LukasvondorLade 
Fragesteller
 25.07.2020, 18:00
@PWolff

Jetzt hat es gar keine Auswirkung.

Aber an sich die Datums und Uhranzeige finde ich gut. Nur am besten wäre ein Doppelpunkt bei der Uhranzeige und das .png und .bmp beibehalten wird.

0
PWolff  25.07.2020, 18:02
@LukasvondorLade

Hoffentlich hast du noch ein Backup der Dateien, sonst ist es schlecht - dann müsste man in die Dateien hineinschauen, um den Typ zu ermitteln. Dürfte auch gehen, ist aber mit reinen Bordmitteln schwierig.

Wie gesagt, der Doppelpunkt hat eine besondere Bedeutung und kann deshalb nicht für Dateinamen verwendet werden. (Wie ?<>|& u. a.)

0
PWolff  25.07.2020, 18:03
@PWolff

Dass es keine Auswirkungen hat bzw. zu haben scheint, liegt daran, dass der Dateiname wieder durch denselben Dateinamen ersetzt wird.

0
LukasvondorLade 
Fragesteller
 25.07.2020, 18:05
@PWolff

Das mit der Dateiendung funktioniert bei mir nicht. Also es funktioniert gar nicht. Ich habe neue .png und .bmp Dateien erstellt und es funktioniert nicht mehr.

0
PWolff  25.07.2020, 18:17
@PWolff

Den Dateityp "BMP" kann man daran erkennen, dass die Datei mit "BM" beginnt; den Dateityp "PNG" daran, dass Zeichen 2 bis 4 "PNG" sind.

Erkennen:

type %dateiname% | findstr /b /r "BM" >NUL
if errorlevel 1 goto :keinBMP
ren "%dateiname%" "%dateiname%.bmp"
:keinBMP

bzw.

type %dateiname% | findstr /b /r ".PNG" >NUL
if errorlevel 1 goto :keinPNG
ren "%dateiname%" "%dateiname%.png"
:keinPNG

wobei %dateiname% natürlich auch durch %%A, %%# oder die entsprechende Laufvariable von FOR ersetzt werden kann.

0
PWolff  25.07.2020, 18:19
@LukasvondorLade

Sorry, hab wieder die doppelten Prozentzeichen vergessen:

for %%# in (*) do @(for /F " usebackq tokens=1-5 delims=.: " %%A in (`dir /tc "%%#" ^| findstr /B /V /C:" "`) do @ren "%%#" "%%C-%%B-%%A %%D.%%E.%%~x#")
0
PWolff  25.07.2020, 18:20
@PWolff

(außerdem fehlte der Punkt vor der Dateiendung)

0
LukasvondorLade 
Fragesteller
 25.07.2020, 18:25
@PWolff

Ok, jetzt funktioniert es. Was ist wenn eine Datei doppelt ist also mit Datum und Uhrzeit?

0
PWolff  25.07.2020, 18:31
@LukasvondorLade

Dann gibt es eine Fehlermeldung.

Das könnte man mit "if exists "%#"" abfangen und dann ggf. eine Nummer so lange hochzählen, bis man einen eindeutigen Dateinamen hat.

0
PWolff  25.07.2020, 18:34
@PWolff

etwa (ohne Gewähr)

set dateiname=%%C-%%B-%%A %%D.%%E.%%~x#
set nummer=0
:existloop
if not exist "%dateiname" goto :endexistloop
  set /a nummer+=1
  set dateiname=%%C-%%B-%%A %%D.%%E (%nummer%).%%~x#
  goto :existloop
:endexistloop
ren "%%#" "%dateiname%"
0
LukasvondorLade 
Fragesteller
 25.07.2020, 18:47
@PWolff

@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 

cd Screenshots

for %%# in (*) do @(for /F " usebackq tokens=1-5 delims=.: " %%A in (`dir /tc "%%#" ^| findstr /B /V /C:" "`) do @ren "%%#" "%%C-%%B-%%A %%D.%%E.%%~x#")

set dateiname=%%C-%%B-%%A %%D.%%E.%%~x#

set nummer=0

:existloop

if not exist "%filename" goto :endexistloop

 set /a nummer+=1

 set filename=%%C-%%B-%%A %%D.%%E (%nummer%).%%~x#

 goto :existloop

:endexistloop

ren "%%#" "%filename%"

pause

exit /b

:notFound

if not exist "System" (

  echo "%~f0" ...

  echo ..."%cd%" ...

) else (

  echo Cannot find images in the "System" folder!

)

pause >NUL

0
PWolff  25.07.2020, 19:01
@LukasvondorLade

Tipp: rechts neben dem Kommetar-Eingabe-Fenster ist ein blau umrandetes "Tt" - wenn man darauf klickt, öffnet sich auch bei Kommentaren die Formatierungsleiste. Mit "</>" kann man einen Text als Quellcode formatieren. Das macht den Code leichter lesbar.

-----

Die Zeile

for %%# in (*) do @(for /F " usebackq tokens=1-5 delims=.: " %%A in (`dir /tc "%%#" ^| findstr /B /V /C:" "`) do @ren "%%#" "%%C-%%B-%%A %%D.%%E.%%~x#")

ist mit der Umbenennung nicht unbedingt verträglich - wenn ein Dateiname schon existiert, führt es zu einer Fehlermeldung. Das ist zwar noch nicht schlimm; schlimm ist, dass die Umbenennung für alle Dateien vorgenommen werden muss:

for %%# in (*) do @(for /F " usebackq tokens=1-5 delims=.: " %%A in (`dir /tc "%%#" ^| findstr /B /V /C:" "`) do (
  set dateiname=%%C-%%B-%%A %%D.%%E.%%~x#
  set nummer=0
  :existloop
  if not exist "%filename" goto :endexistloop
    set /a nummer+=1
    set filename=%%C-%%B-%%A %%D.%%E (%nummer%).%%~x#
    goto :existloop
  :endexistloop
  ren "%%#" "%filename%"
)
0
LukasvondorLade 
Fragesteller
 25.07.2020, 19:12
@PWolff
Es ändert jetzt den Namen nicht mehr (Datum und Uhrzeit).
0
Erzesel  26.07.2020, 00:06

Oft reichen nicht mal die Sekunden... um eine klare Trennung herzustellen

Wo hast Du denn das Monster ausgebuddelt?😱 Das mit dem Dir /tc ist nicht nötig. die Parametervariable %%~t# enthält das gleiche, was du so umständlich ausfilterst...

habs mal auf mehrere Zeilen verteilt:

@echo off

for %%# in (*) do (
    for /f " tokens=1-5 delims=.: " %%f in ("%%~t#") do ( 
          rem nix  umbenennen nur  tun als ob...
        echo @ren "%%~f#" "%%h%%g%%f%%i%%j-%%~n#.neueEndung"
        echo:
     )
)
pause
0
PWolff  27.07.2020, 17:29
@Erzesel

%%~t# liefert nur das Änderungsdatum. Gefragt war aber nach dem Erstellungsdatum.

1

Das geht zum Beispiel mit XnView MP.

  • Alle Screenshots markieren
  • Rechtsklick
  • Stapel-Umbenennen
  • Auf den Pfeil links neben Vorlage löschen
  • Erstelldatum auswählen.
  • Ersetzen anhaken und " CEST" durch nichts ersetzen
  • Überprüfen und bei Gefallen OK.

Bild zum Beitrag

Woher ich das weiß:eigene Erfahrung
 - (Technik, Windows, programmieren)