Batch zum bestimmte Zeichen im Titel entfernen?

8 Antworten

Was du suchst ist mehr oder weniger das hier:

for /f "tokens=1* delims=-" %i in ('ORDNERPFAD\*.jpg"') do @echo ren "ORDNERPFAD\%iZUERSETZENDESZEICHEN%j" "%ALTERNATIVE EINFÜGUNG%j"

Das wird nicht die Ideal-Lösung sein aber ich bin kein Batch-Programmierer und Batch ist nun mal *.

So wird es nur eine Ausgabe in der Konsole machen und du kannst überprüfen, ob das gewünschte Ergebnis eintritt. Hab's nicht durchgetestet, müsste aber grob hinhauen. Danach, wenn du es tatsächlich nutzen möchtest, entferne @echo.

Vermutlich musst du es mehrmals starten, da es immer nur ein Zeichen pro Datei ändert. Aber immernoch besser, als das per Hand zu machen. (Kannst es ja auch einfach mehrmals einfügen)

Ansonsten:

https://www.netzwelt.de/download/7411-flexible-renamer.html

Whow... Du bist der erleuchtete Batchmaster...
Nicht wirklich...
Wieso schreibt jemand eine Zeile irgendwas, das wie Batch aussieht und und in Wirklichkeit Nonsens ist.
So wie Angegeben zerhackt delims=- im in_Block augefilterte Dateinamen un ersten auftauchenden Minuszeichen . Der do-block ist einfach nur irgendwas ...
Du gibst selbst an das Du keine Ahnung von Batch hast... und behauptest Batch sei *.
OhhhJahhh in batch ist * gleichzusetzen mit Alles.... Ich bin Sicher du meintest mit dem Sternchen nicht "Alles".
Überlasse Antworten zu Batch den Leuten , welche die Klaviatur dieser Sprache beherrschen , Und selbst diese Leute erleben mit dieser Sprache zuweilen noch Überraschungen.

nur auf das reagieren echte Batcher mit einem breiten grinsen:

%0|%0


der Tipp mit Flexible-Renamer könnte hingegen hilfreich sein...

1
@Erzesel

Ich danke dir für deinen unqualifizierten Beitrag :) der meinem in nichts nach zu stehen scheint. Nicht in der Qualität, doch im Stiel.

Es gab keine Antwort und dies ist ein Ansatz, um zumindest die ' raus zu bekommen.

Das es so nicht funktioniert, wundert mich nicht. Habe, wie oben genannt, keine Ahnung. Es ist dennoch näher der Lösung, als alles Andere hier. Dein Kommentar mit eingeschlossen.

Mnsfg

0

Wenn es sich um Anführungszeichen in Dateinamen handelt ist mit Batch leider nicht viel zu machen.
Anführungszeichen verstoßen gegen die die Dateinamen-Konvention von Windows ich bezweifle fast, das die meisten Programme überhaupt fähig sind derartige Dateien zu händeln.

Du kannst es mit Doublecommand oder Far versuchen....

Sicher gibt es die Möglichkeit irgendwas zu basteln, welches mit dem Problem umgehen kann, aber so auf die schnelle ---no way
Zum Testen müsste ich ja erstmal ein Programm schreiben , welches derartige Dateinamen generiert... irrsinn

Schau lieber mal nach, welches Programm solchen Schrott auf deine Festplatte schaufelt. Ich kenne solche Namen eigentlich nur von einigen recht seltenen Programmen , wo die User eine Namensmaske für die erzeugten Dateien selbst festlegen können. Schau mal in Deinem Programm das diese Dateinen geschrieben hat ob es etwas derartiges gibt und entfern dort alles unzulässige aus der Maske.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Das nutzt mir absolut nichts. Die Datein sind schon generiert und das Programm das diese Datein erzeugt lässt kaum Optionen zu ist aber am besten in der Handhabung.

0
@IchFragHaltErst

kannst Du mir den Namen des Programms nennen , welches deartige Dateinamen generiert.
Ich habe jetzt verzweifelt versucht ein Programm zu schreiben, welches derartige Dateien erzeugt. Mein System wehrt sich dagegen (wie es auch sein sollte).
Ich habe schon eine theoretische Idee wie ich die "bösen" Zeichen aus den Namen entfernen könnte. Einen Schuß ins Blaue zu machen oder gar etwas unerprobtes auf einen fremden Rechner loszulassen wiedersterebt mir jedoch.
Auf jeden Fall ist das Problem eine programmiertechnische Herausforderung erster Güte .
Wie gesagt, ohne derartige Dateien auf meinem Experimantalrechner bleibt das alles Theorie.
Wenn eine Idee in die Hose geht boote ich einfach von einer anderen Festplatte, diese Möglichkeit habe die meisten anderen Leute wohl eher nicht :D

1

so...
...ich habe mal gebastelt.

Mit purer Batch geht nicht alles , wie Tim schon anmerkte.
Die Verarbeitung von Dateinamen mit Anführungszeichen(") im Namen dürfte bereits beim Einlesen der der Dateinamen auf Problem stoßen.

Um alle derartigen Probleme zu umgehen setze ich in meinem Lösungsansatz
auf Javascript in einer Batch-JScript-Chimera.

Ich konnte das Ganze zwar nicht mit mit "verbotenen" Dateinamen Testen, aber immerhin scheint es Javascript völlig egal zu sein ob singlequotes (') im namen sind , welche bei Javascript ebenfalls Spezialfunktionen haben.

die RegalareExpresion: /[%'"`´+=~!?]/g legt die Zeichen fest welche entfernt werden sollen ( % " ' ` ´ + = ! ?). (wer weniger oder mehr zeichen entfernt haben möchte kann diese im Script entfernen/ergänzen.

Bereinigte Dateien werden in einem Unterordner namens "cleanFiles" abgelegt.

Wie berets des öffteren erwähnt benenne ich weder Dateien auf fremden Rechnern um , noch lösche ich irgend etwas, was ich nicht selbst erzeugt habe.
...also darum Copyfile statt Movefile!
Ich hoffe die einzelnen Schritte sind in der Batch ausreichend kommentiert.

clean_bad_Filenames.cmd:

<!-- : diese Zeile nicht löschen
@echo off
 rem diese variante wirkt nur auf Dateien im Ordner,
 rem in welchem sich die Batch befindet.
set "self=%~f0"
title %~nx0
 rem um einen anderen Ordner zu verarbeiten, hier ein "cd /pfad" einfügen
start /wait /min "" mshta "%self%" 
 rem brutaler test :), zwei Fliegen in einer Klappe
rd /q "cleanfiles" 2>nul &&(echo no Filename to Cleanup & pause)||(start "" "cleanfiles")
exit /b 0
und diese auch nicht -->
<body>
<script> 
fso = new ActiveXObject("Scripting.FileSystemObject"); 
currentFolder ='.\\'
cleanFileFolder='.\\cleanFiles\\';
 //wenn nicht exist erstelle Ordner für bereinigte Datein
if (! fso.FolderExists(cleanFileFolder)) {fso.CreateFolder(cleanFileFolder)};
 // entspricht den Dir-Befehl in Batch...
fileList = new Enumerator(fso.GetFolder(currentFolder).files);
 //wenn nicht exist erstelle Ordner wür bereinigte Datein
if (! fso.FolderExists(cleanFileFolder)) {fso.CreateFolder(cleanFileFolder)};
 // dateiliste abarbeiten
for (;!fileList.atEnd();fileList.moveNext())
{
  sourcefile= new String(fileList.item());
   // wenn die in der regularExpresion aufgeführten Zeichen enthlten sind:
  if (sourcefile.match(/[%'"`´+=~!?]/g)) 
  {
     //entferne betreffende Zeichen
    destfile=sourcefile.split('\\').pop().replace(/[%'"`´+=~!?]/g, '');
     /* erstelle eine Kopie mit "sauberem" Namen in Unterordner..."cleanFiles "
     ...überschreibt jedoch keine  bereits vorhandenen Dateien ".CopyFile(... , ... ,false)"
     try-catch unterdrückt Fehlerabbbruch, wenn eine schreibgeschützte Datei gleichen Namens im Zielordner */
    try{fso.CopyFile(sourcefile,cleanFileFolder+destfile,false);}catch(err){};
  };
}
close(); 
</script></body>
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Ps:
einmal reicht :)

 //wenn nicht exist erstelle Ordner wür bereinigte Datein
if (! fso.FolderExists(cleanFileFolder)) {fso.CreateFolder(cleanFileFolder)};

Irgendwie Doppelt gemoppelt beim einfügen...
macht zwar nix, aber einmal kann gelöscht werden ;) ...sorry passiert...

0

muss es ne Batch sein?

Das Win-Prog "Renameus" ist da echt super.

Wenns ne Batch sein muss, ne For-Schleife mit Delims=' .

Allerdings sollte es nicht möglich sein, in einem Dateinamen " zu verwenden.

Ein Programm generiert solche Files.

0
@IchFragHaltErst

Also ich habs nochmal versucht, normal sollten " nicht möglich sein. Zumindest nicht unter Microsofts Betriebssystemen.

Auf der Kommandozeile werden die einfach ignoriert, in Windows meckert er schon beim Versuch die Zeichen einzugeben.

Mh für die Umbenennung aber wohl nicht von Bedeutung. Macht aber die Verwendung einer Batch aufwändiger.

0

Ich konnte meinen Code nur mit einfachen ' Anführungszeichen testen und bezweifle stark, dass er auch mit normalen " zurechtkommt.

Da durch das entfernen von Zeichen (ich hab entschlossen du hast bereits genug _ in deinen Dateinamen) mehrere Dateien den gleichen Namen bekommen könnten, hab ich dafür auch was geschrieben.

FOR %%F in (*.jpg) do call :renameFile "%%~nxF"
exit
:renameFile
set "nam=%~n1"
set "ext=%~x1"
set "nam=%nam:'=%"
set "fil=%nam%%ext%"
if exist "%fil%" call :createUniqueName
rename "%~1" "%fil%"
exit /b %errorlevel%

:createUniqueName
set /a i=0
:_createUniqueName
set /a i+=1
if exist "%nam% (%i%)%ext%" goto _createUniqueName
set "fil=%nam% (%i%)%ext%"
exit /b 0


ich habe es erstmal um die Ecke gedacht...

die Sonderzeichen loszuwerden ist in JScript schon fast lächerlich trivial:

testfilename='\"blah\"_~und++`_\'blu´bb\'.txt '
testfilename_clean=testfilename.replace(/[%'"+`´~]/g, '');

das ganze als Batch-Chimera:

remove_spec_chars.cmd

<!-- : Begin batch script 
@echo off
start "" mshta.exe "%~f0" %args%
ping -n 5 localhost> nul
exit /b
::exit /b prevent's the Batch from parsing the leftover of the batchfile
::after the next line begins the HTML/HTA itself
-->
<!DOCTYPE html>
<title>Testanwendung</title>
<html>
 <head>
 <style type="text/css">
  body{
   color: white; /* global Fontcolor*/   
   background-color: blue; 
  }
 </style>
 <script>
 function Window_onLoad()
 {
			testfilename='\"blah\"_~und++`_\'blu´bb\'.txt '
			testfilename_clean=testfilename.replace(/[%'"+`´~]/g, '');
			document.getElementById('out').innerHTML = testfilename+'<br>' + testfilename_clean +'<br>';
	 }
 </script>
 </head>
 <body onload="Window_onLoad()" >
  <br>
  <div id="out"></div>
  <br>
  <BUTTON onclick="window.close()">schiessen</BUTTON>
 </body>
</html>

leider habe ich immer nur sporadisch zeit zum basteln.
...aber wenn das erledigt ist, sollte das einlesen und umbennennen über das Scripting.FileSystemObject auch keine riesige Hürde sein.

1