Ordnername zeichenweise auslesen - ein weiteres Zeichen einfügen
Hallo,
ich habe keine Lust auf eine anstehende "Strafarbeit" und wollte die Arbeit lieber ein Batch erledigen lassen:
1. vierstelligen Ordnernamen zeichenweise auslesen, um an der zweiten Stelle eine Null einzufügen (xxxx --> x0xxx)
2. Verzeichnis x0xxx erzeugen
3. Originalordner xxxx in xxxx-blafasel umbenennen
4. xxxx-blafasel nach x0xxx verschieben
Die Punkte 2-4 sind ja eher unproblematisch, aber wie bekomme ich die Null an die zweite Stelle?
geTuemII
ich habe keine Lust auf eine anstehende "Strafarbeit" und wollte die Arbeit lieber ein Batch erledigen lassen:
1. vierstelligen Ordnernamen zeichenweise auslesen, um an der zweiten Stelle eine Null einzufügen (xxxx --> x0xxx)
2. Verzeichnis x0xxx erzeugen
3. Originalordner xxxx in xxxx-blafasel umbenennen
4. xxxx-blafasel nach x0xxx verschieben
Die Punkte 2-4 sind ja eher unproblematisch, aber wie bekomme ich die Null an die zweite Stelle?
geTuemII
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 68627
Url: https://administrator.de/contentid/68627
Ausgedruckt am: 22.11.2024 um 01:11 Uhr
10 Kommentare
Neuester Kommentar
Hallo geTuemII!
Ich will ja gar nicht fragen, was Du so angestellt hast , aber eine derartige "Strafe" wirst Du ganz sicher nicht verdient haben - daher ein klein wenig Unterstützung:
Den Rest schaffst Du dann schon ...
Grüße
bastla
Ich will ja gar nicht fragen, was Du so angestellt hast , aber eine derartige "Strafe" wirst Du ganz sicher nicht verdient haben - daher ein klein wenig Unterstützung:
@echo off & setlocal
set Old=1234
set New=%Old:~0,1%0%Old:~1%
echo %New%
Grüße
bastla
Hmmmm, geTuemII,
ich weiß ja, dass Du Spaß verstehst und für ein Mädchen ziemlich belastbar bist... <abduck>
Also - nur als Angebot- es ginge natürlich auch mit einem Oneliner.
okay, ich habe vorher mit "mode con cols=200 lines=33" erstmal eine "line" für den Oneliner neu definiert *zugeb*
Aber wenn Deine Situation-IST so aussieht:
---> also eine Ordnerstruktur (mit 4 Zeichen langen SubDirs) unterhalb einer beliebigen Ebene
...und Soll-Szenario danach ist:
Dann macht das diese Zeile vom CMD-Prompt* aus:
Aber ich würde es - wegen der Nerven - auf drei, vier Zeilen Batch auswalzen.
Dann kann frau auch der Geschäftsleitung ein beeindruckendes Ergebnis vorweisen und nich' nur eben eine Zeile.
Wofür es denn die Strafe war, wüsste ich aber auch gern... kannst Du aber auch mal einem Cappuccino erzählen..
Grüße
Biber
P.S. wg. *CMD-Prompt: bei meinem CMD-Prompt ist "EnableDelayedExpansion" immer gesetzt.
Sonst muss noch ein "Setlocal EnableDelayedExpansion & " davor.
Vor das for vor dem /d.
Davor halt. *räusper*
ich weiß ja, dass Du Spaß verstehst und für ein Mädchen ziemlich belastbar bist... <abduck>
Also - nur als Angebot- es ginge natürlich auch mit einem Oneliner.
okay, ich habe vorher mit "mode con cols=200 lines=33" erstmal eine "line" für den Oneliner neu definiert *zugeb*
Aber wenn Deine Situation-IST so aussieht:
>for /D %i in ("D:\Temp\getuemII\????") do @echo %i
D:\Temp\getuemII\1234
D:\Temp\getuemII\1777
D:\Temp\getuemII\3657
D:\Temp\getuemII\9876
...und Soll-Szenario danach ist:
>for /r "D:\Temp\getuemII" %i in (.) do @echo %~fi
D:\temp\getuemII
D:\temp\getuemII\10234
D:\temp\getuemII\10234\1234_blafasel
D:\temp\getuemII\10777
D:\temp\getuemII\10777\1777_blafasel
D:\temp\getuemII\30657
D:\temp\getuemII\30657\3657_blafasel
D:\temp\getuemII\90876
D:\temp\getuemII\90876\9876_blafasel
Dann macht das diese Zeile vom CMD-Prompt* aus:
for /d %i in (\temp\getuemII\????) do @set "Old=%~ni" & @for /f %j in ("%~dpi!old:~,1!0!old:~-3!") do @(md "%~dpi%~nj") & move "%~fi" "%~dpnj\%~ni_blafasel"
Aber ich würde es - wegen der Nerven - auf drei, vier Zeilen Batch auswalzen.
Dann kann frau auch der Geschäftsleitung ein beeindruckendes Ergebnis vorweisen und nich' nur eben eine Zeile.
Wofür es denn die Strafe war, wüsste ich aber auch gern... kannst Du aber auch mal einem Cappuccino erzählen..
Grüße
Biber
P.S. wg. *CMD-Prompt: bei meinem CMD-Prompt ist "EnableDelayedExpansion" immer gesetzt.
Sonst muss noch ein "Setlocal EnableDelayedExpansion & " davor.
Vor das for vor dem /d.
Davor halt. *räusper*
Hallo geTuemII!
Damit Du Dich von mir nicht ganz im Stich gelassen fühlst:
Is zwar nicht mehr, schaut aber so aus ...
... und das "Setlocal EnableDelayedExpansion" ist damit auch vom Tisch.
Grüße
bastla
Damit Du Dich von mir nicht ganz im Stich gelassen fühlst:
@echo off & setlocal
for /d %%i in (D:\temp\getuemII\????) do call :ProcessFolder "%%i"
goto :eof
:ProcessFolder
set "Old=%~n1"
set "New=%Old:~0,1%0%Old:~1%"
md "%~dp1%New%"
move "%~f1" "%~dp1%New%\%~n1_blafasel">nul
Is zwar nicht mehr, schaut aber so aus ...
... und das "Setlocal EnableDelayedExpansion" ist damit auch vom Tisch.
Grüße
bastla
... und, nur der Ordnung halber: Wenn Du Biber's Oneliner in eine Batchdatei stellst (mit doppelten %%), also etwa
klappt's natürlich.
@Biber
Könnte folgende Interpretation hinkommen:
Vom Prompt funktioniert der Oneliner (auch bei mir) nicht, weil das leidige "Setlocal EnableDelayedExpansion", auch wenn es, wie beschrieben, vorweg eingegeben wird, dennoch schon "zu spät" kommt (es wird als Teil dieser einzigen Zeile betrachtet und kann sich dadurch auf den Rest der Zeile nicht mehr auswirken).
Grüße
bastla
@echo off & setlocal enabledelayedexpansion
for /d %%i in (\temp\getuemII\????) do @set "Old=%%~ni" & @for /f %%j in ("%%~dpi!old:~,1!0!old:~-3!") do @(md "%%~dpi%%~nj") & move "%%~fi" "%%~dpnj\%%~ni_blafasel"
@Biber
Könnte folgende Interpretation hinkommen:
Vom Prompt funktioniert der Oneliner (auch bei mir) nicht, weil das leidige "Setlocal EnableDelayedExpansion", auch wenn es, wie beschrieben, vorweg eingegeben wird, dennoch schon "zu spät" kommt (es wird als Teil dieser einzigen Zeile betrachtet und kann sich dadurch auf den Rest der Zeile nicht mehr auswirken).
Grüße
bastla
Hallo geTuemII!
Jedenfalls scheint es jetzt so, als hättest Du Deine Strafe abgesessen - freut mich, wenn's tatsächlich so ist.
Grüße
bastla
Daß in die Batches doppel% gehören, habe sogar ich schon gelernt
Auch wenn ich Dich damit enttäuschen sollte: Der Hinweis war gar nicht für Dich gedacht, sondern auch "der Ordnung halber" (ich hatte ja Biber's Code verändert).Jedenfalls scheint es jetzt so, als hättest Du Deine Strafe abgesessen - freut mich, wenn's tatsächlich so ist.
Grüße
bastla
Moin, ihr beiden,
okay, okay, dann will ich wenigstens für die eventuellen neueren MitleserInnen ein paar Insider-Jokes erläutern. Nur damit niemand in eine falsche Richtung läuft.
Der oben gepostete Oneliner funktioniert in der Tat bei mir, ist aber dennoch natürlich Firlefanz, Taschenspielergetrickse, etwas für langweilige betriebliche Weihnachtsfeiern.
Aus zwei Gründen:
Zu der Voreinstellung von "Setlocal EnableDelayedExpansion":
Ich habe es unter anderem in den Kommentaren unterhalb des Tutorials Workshop Batch for Runaways III mal gepostet:
[Zitat]
Eine weitere -vermutlich aus berechtigter Scham- von M$ verschwiegene Möglichkeit,
das "EnableDelayedExpansion"-Verhalten am CMD-Prompt zu erzwingen ist:
Eine beliebigen Batch zu schreiben
Grüße
Biber
okay, okay, dann will ich wenigstens für die eventuellen neueren MitleserInnen ein paar Insider-Jokes erläutern. Nur damit niemand in eine falsche Richtung läuft.
Der oben gepostete Oneliner funktioniert in der Tat bei mir, ist aber dennoch natürlich Firlefanz, Taschenspielergetrickse, etwas für langweilige betriebliche Weihnachtsfeiern.
Aus zwei Gründen:
- ist nicht lesbar / pflegbar /wartbar / dokumentierbar und von daher absolut tabu für den Einsatz auf Nicht-Privatrechnern. Wie jeder Admin/jede Admine selbstredend weiß.
- Für die Tipps & Tricks-Rubrik einer Tankstellen-PC-Zeitschrift darf er gerne vorgeschlagen werden. Und wer für diese Einsendung noch 20 Euro abstaubt und an Greenpeace überweist, hat meine ausdrückliche Genehmigung.
- zweiter Grund ist: für diesen verspielten Oneliner braucht ein Bremer Durchschnittsbiber das 4fache der Zeit, die ein les-, pfleg- und wartbarer mehrzeiliger bastla-Batch (s.o.) erfordern würde. War also nur ein Gag.
Zu der Voreinstellung von "Setlocal EnableDelayedExpansion":
Ich habe es unter anderem in den Kommentaren unterhalb des Tutorials Workshop Batch for Runaways III mal gepostet:
[Zitat]
Sieht bei mir so aus:
reg query "HKEY_CURRENT_USER\Software\Microsoft\Command Processor"
! REG.EXE VERSION 3.0
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
CompletionChar REG_DWORD 0x9
DefaultColor REG_DWORD 0x74
PathCompletionChar REG_DWORD 0x9
DisableUNCCheck REG_DWORD 0x1
EnableExtensions REG_DWORD 0x1
DelayedExpansion REG_DWORD 0x1
Der zweite (nicht oder kaum dokumentierte) fette Eintrag bewirkt bei mir, dass die DelayedExpansion, die verzögerte Variablenauflösung standardmäßig aktiviert ist.
Bei "Auslieferung ab Werk" ist das auf Windowsrechnern nicht so.
[/Zitat Ende]reg query "HKEY_CURRENT_USER\Software\Microsoft\Command Processor"
! REG.EXE VERSION 3.0
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
CompletionChar REG_DWORD 0x9
DefaultColor REG_DWORD 0x74
PathCompletionChar REG_DWORD 0x9
DisableUNCCheck REG_DWORD 0x1
EnableExtensions REG_DWORD 0x1
DelayedExpansion REG_DWORD 0x1
Der zweite (nicht oder kaum dokumentierte) fette Eintrag bewirkt bei mir, dass die DelayedExpansion, die verzögerte Variablenauflösung standardmäßig aktiviert ist.
Bei "Auslieferung ab Werk" ist das auf Windowsrechnern nicht so.
Eine weitere -vermutlich aus berechtigter Scham- von M$ verschwiegene Möglichkeit,
das "EnableDelayedExpansion"-Verhalten am CMD-Prompt zu erzwingen ist:
Eine beliebigen Batch zu schreiben
- mit der Anweisung "Setlocal EnableDelayedExpansion" in der ersten Zeile
- und diesen Batch danach mit irgendeiner ungültigen Syntax ("for /f %%i in grütze do quark") gegen die Wand zu fahren.
- die Einstellung "EnableDelayedExpansion" bleibt in diesem Fall am CMD-Prompt erhalten.
- Ich bitte, daraus keine voreiligen Schlüsse bezüglich der Quälität von M$-Produkten zu ziehen.
- Auch dieser Tipp könnte Greenpeace 10 Euro bringen.
Grüße
Biber