NEU Batchdatei - Rename - Syntaxfehler

Hallo,
die Batchdatei von Sancho (einige Zeilen unten) hat bei mir im XP funktioniert. Aber bei Win98Se kommt Syntaxfehler: Sprungmarke nicht gefunden. Ich benötige aber die Batch im w98.
Viell, gibt es noch einen anderen Weg, mit der Sprungmarke. Danke vorab.
Gruß Klaus

Hallo klaus,

die Batchdatei von Sancho (einige Zeilen unten) hat bei mir im
XP funktioniert. Aber bei Win98Se kommt Syntaxfehler:
Sprungmarke nicht gefunden. Ich benötige aber die Batch im
w98. Viell, gibt es noch einen anderen Weg, mit der Sprungmarke.

Ich hab mal nachgesehehn, in Win98 geht

call :MARKE

nicht. Das geht erst ab NT-Kernel.
Hehe, da kann man ja doch noch Lorbeeren ernten :wink:
Wo ist denn hier nur ein Win98 für mich … :wink:)

Grüße

CMБ


hab ich noch mal den PErl-Editor
angeworfen:

 #perl -w
 my $fn = defined $ARGV[0] ? $ARGV[0] : "datei"; # 1
 my @lst = grep { /\d$/ } ; # 2
 my @num = sort map { (split /\./)[1] } @lst; # 3
 rename($fn, $fn.'.'.($num[$#num]+1)) or die "Rename-Fehler"; # 4
 print $fn, " --\> ", $fn.'.'.($num[$#num]+1), "\n";

Es ist also mit 4(+) Zeilen Perl zu machen.
Das geht in die Datei prename.pl, der
Aufruf wäre dann aus Deiner anderen Batchdatei:

 ...
 perl prename.pl **datei**
 ...

wobei ‚datei‘ der „Basisname“ ist.

Danke, dass ich wieder mal mit Perl rumspielen durfte :wink:

Grüße

CMБ

Hallo CMБ
do call :Marke wird die Hürde für w98 sein, denn „goto“ klappt ja in w98. Schauen wir mal, was Sancho meint, viell. hat er ja eine Idee
Gruß Klaus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo CMБ,
Danke, bevor ich jetzt die 15 mb Perl runterlade (welches ist auch noch nicht klar) und ich auf 4 Usern Perl installiere, möchte ich zuerst noch etwas warten, aber die Chancen steigen.
Grüße von Klaus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Re^3: Also jetzt wo weider alles offen ist :wink:
Hallo

Danke, bevor ich jetzt die 15 mb Perl runterlade (welches ist
auch noch nicht klar) und ich auf 4 Usern Perl installiere,

Das hier (12MB) -->
erst MSI-Installer (W98)
http://downloads.activestate.com/contrib/Microsoft/M…
und dann das Perl:
http://downloads.activestate.com/ActivePerl/Windows/…

Aber Du hast schon recht. Wenn es mit Batch schmerzfrei geht -
und wenn dann nicht noch komplexere Verschiebungen er-
folgen sollen, reicht eine Batch-Datei allemal.

Ich würde es wahrscheinlich auch so machen.

Grüße

CMБ

Mahlzeit,

Schauen wir mal, was Sancho meint, viell. hat er ja
eine Idee

ja, Ideen hab ich viele, bloß kein Win98 :frowning:

Ich vermute, daß einiges davon nicht klappen wird, weil das auf sog. „CMD-Erweiterungen“ aufbaut - und die sind vermutlich nicht in Wi98 eingebaut. Es ist aber nur eine Vermutung!

Gruß

Sancho

Tach,

im Sinne von Perl muss ich hier einen Einspruch einlegen - das wird so nicht funktionieren:

#perl -w

my $fn = defined $ARGV[0] ? $ARGV[0] : „datei“;
my @lst = grep { /\d$/ } ;
my @num = sort map { (split /./)[1] } @lst;

–> sort() sortiert in dieser Form alphanumerisch (d.h. bei den Dateinamen 1, 10, 11, 12, …, 20, … usw.). Das würde also nur bei Extensions funktionieren, die alle gleich lang sind (001, 002, …).

rename($fn, $fn.’.’.($num[$#num]+1)) or die „Rename-Fehler“;

Hier wird nur eine einzige Datei umbenannt und nicht alle in einem Rutsch. Ohne irgendeine Schleifenkonstruktion kann das nicht funktionieren.

print $fn, " --> „, $fn.’.’.($num[$#num]+1), :“\n";

Also etwas mehr nachdenken, dann ein neuer Versuch:

#! /usr/bin/perl -w

my $fn = defined $ARGV[0] ? $ARGV[0] : "datei";
my @filenames = grep {
 $\_ =~ /^$fn\.\d+$/ and # "Fname" . 
 -f $\_ # nur echte Dateien
 } ;
my @nums = sort { 
 $a $b # numerisch sortieren
 } map {
 $\_ =~ m/^$fn\.(\d+)$/; # nur die Extensions
 $1 # (aus erster Klammer)
 } @filenames;

foreach (reverse (0..$#nums-1)) 
{
 rename $fn . "." . $nums[$\_], $fn . "." .$nums[$\_+1] 
 or die "Fehler bei rename";
}

(laesst sich auch in weniger Zeilen verpacken, aber Lesbarkeit hilft manchmal doch enorm!)

gruss
bbr

Hallo Bernhard

im Sinne von Perl muss ich hier einen Einspruch einlegen - das
wird so nicht funktionieren:

mal sehen :wink:

my $fn = defined $ARGV[0] ? $ARGV[0] : „datei“;
my @lst = grep { /\d$/ } ;
my @num = sort map { (split /./)[1] } @lst;

–> sort() sortiert in dieser Form alphanumerisch (d.h. bei
den Dateinamen 1, 10, 11, 12, …, 20, … usw.). Das würde
also nur bei Extensions funktionieren, die alle gleich lang
sind (001, 002, …).

Verdammt, Du hast recht! Es klappt von 0…9, so wie ich
es getestet habe :wink: Aber 0…999 klappt es nicht, da, wie
Du richtig sagst, nicht numerisch {$a $b} sortiert wird.

Das ist wahrscheinlich ein typischer „Anfängerfehler“
(ich schreibe zwar seit +10 Jahren in C/C++, aber erst
seit kurzem in Perl.)

rename($fn, $fn.’.’.($num[$#num]+1)) or die „Rename-Fehler“;

Hier wird nur eine einzige Datei umbenannt und nicht alle in
einem Rutsch. Ohne irgendeine Schleifenkonstruktion kann das
nicht funktionieren.

Nein, ich denke, das hast Du falsch verstanden. Es soll
bei jedem Aufruf nur eine Datei umbenant werden, nämlich
jeweils die irgendwann neu hinzugekommene ‚datei‘.

Also etwas mehr nachdenken, dann ein neuer Versuch:

Hier also das mit Deiner Hilfe korrigierte (immer noch 4-zeilige-)Programm:

 #perl -w
 my $fn = defined $ARGV[0] ? $ARGV[0] : "datei"; # 1
 my @lst = grep { /\d$/ } ; # 2
 my @num = sort **{$a $b}** map { (split /\./)[1] } @lst; # 3
 rename($fn, $fn.'.'.($num[$#num]+1)) or die "Rename-Fehler"; # 4
 print $fn, " --\> ", $fn.'.'.($num[$#num]+1), "\n";

Grüße & Danke!

CMБ

Mahlzeit,

Schauen wir mal, was Sancho meint, viell. hat er ja
eine Idee

ja, Ideen hab ich viele, bloß kein Win98 :frowning:

Ich vermute, daß einiges davon nicht klappen wird, weil das
auf sog. „CMD-Erweiterungen“ aufbaut - und die sind vermutlich
nicht in Wi98 eingebaut. Es ist aber nur eine Vermutung!

Habe auch kein Win98 installiert, aber das Problem müsste bei
call :Label
liegen. Aber „call xyz.bat“ geht. Also muss man das ganze mit 2 Batchdateien verwirklichen.

Wenn ich mich nicht irre, kennt Win98 auch das Label

eof

nicht.

MfG Peter(TOO)

Hallo,
es geht pro batch-ablauf immer nur um eine Datei die dann umbenannt wird. Egal ist mir auch die Reihenfolge ob das mit 1,2,3 oder 001,002,003 bis 999 geht. Hauptsache das eine Zählung erfolgt /und-oder eine Unterscheidung der einzelnen Dateien erfolgt.
Ich müßte dann nur noch wissen, welches Perl ich downloaden muss und ob ich es im Netz installieren kann, damit ich nicht jedem einzelen User eines (Perl) verpassen muss.
Gruß Klaus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Peter,
während ich oben geantwortet habe, kam Deine Hilfe.
Es ist richtig, dass do call xyz.Bat funktioniert. Dieses habe ich in einen anderen Batch drin. Aber wie sollte dann die zweite Batch aussehen. Genau wie Du meine ich, das eof kennt W98 nicht.
Danke vorab und Gruß Klaus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Mahlzeit,

Es ist richtig, dass do call xyz.Bat funktioniert. Dieses habe
ich in einen anderen Batch drin. Aber wie sollte dann die
zweite Batch aussehen. Genau wie Du meine ich, das eof kennt
W98 nicht.

Beides ist kein Beinbruch. Für ersteres mußt du alles ab dem Label „:mv“ (ohne diesen mitzunehmen) in eine Datei Namens mv.bat verlegen, oben anstatt „call :mv %1 %%i%“ nur „call mv.bat %1 %%i%“ eintragen.
Für Letzteres mußt du als letzte Zeile in der Batchdatei ein Label Namens :ende eintragen und überall dort, wo „goto :eof“ steht, „goto ende“ stattdessen verwenden. Alles kein Problem.

Aber ich glaube, das wird nicht gehen, weil Win98 keine for-Schleifen kennt. Ich habe keine Befehlsreferenz dafür gefunden, aber zumindest DOS 6.22 kannte das nicht: http://www.mipraso.de/enzyklopaedie/d/dos622/for.html

Mach doch folgendes: gib auf der Kommandozeile „for /? | more“ ein bzw. „help for“. Was sagt die Hilfe dazu?

Gruß

Sancho

Hallo Sancho,
mit dem „for“ klappt das schon in win98, denn meine jetzige Bat sieht wie folgt aus:
Erf1.bat
for %%a in (*) do call c:\bat\erf2.bat %%a

Erf2.bat
@ECHO OFF
ren %1 %1.01
ren %1 %1.02
ren %1 %1.03
ren %1 %1.04
ren %1 %1.05
ren %1 %1.06
ren %1 %1.07
ren %1 %1.08
ren bis 50 habe ich editiert.
und Deine Batch sieht so aus:
@echo off
for /l %%i in (1, 1, 999) do call mv.bat %1 %%i%
__
Mv.Bat
set abb=
goto ende

:mv
if „%abb%“==„TRUE“ goto ende

set neuername=%~n1%
set ext=%2%
set neuername=%neuername%.
set neuername=%neuername%%ext%

ren %1 %neuername% 2>nul
if errorlevel 1 goto ende

:weiter
echo Datei %~dpnx1 wurde zu Datei %neuername% umbenannt
set abb=TRUE
:ende
__
Deine von mir geänderte Batch bringen Syntaxfehler. Jetzt bin ich gespannt, den Rat von Dir zu bekommen.
Grüße von Klaus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Re^4: Also jetzt wo weider alles offen ist :wink:
Hallo klaus,

es geht pro batch-ablauf immer nur um eine Datei die dann
umbenannt wird. Egal ist mir auch die Reihenfolge ob das mit
1,2,3 oder 001,002,003 bis 999 geht. Hauptsache das eine
Zählung erfolgt /und-oder eine Unterscheidung der einzelnen
Dateien erfolgt.

OK, ich hab das Perl-Dingens jetzt so geändert,
dass ggf. 2-stellige Zahlen (mit führender Null)
hinter dem Punkt schreibt. Durch die Ännderung
einer Zahl (2 -> 4) kann man auch 4-stellige oder
sonstige Zahlen erzeugen. Ich hänge das aktuelle
Programm an (5 Zeilen).

Ich müßte dann nur noch wissen, welches Perl ich downloaden
muss und ob ich es im Netz installieren kann, damit ich nicht
jedem einzelen User eines (Perl) verpassen muss.

Es reicht, bei jedem Rechner lediglich K:\Perl\bin
(wenn Netzlaufwerk K:smile: in den Suchpfad %PATH% zu setzen.
Das sollte es gewesen sein.

Dann reicht es, wenn Du das .zip-Perl runterlädtst
und auf dem Server auspackst, imho.
http://downloads.activestate.com/ActivePerl/Windows/…

Ich hänge hier mal das Zeug an:

 #perl -w
 my $fn = defined $ARGV[0] ? $ARGV[0] : "datei"; # 1
 my @lst = grep { /\d$/ } ; # 2
 my @num = sort {$a $b} map { (split /\./)[1] } @lst; # 3
 my $new = sprintf("%s.%0 **2** d", $fn, $num[$#num]+1); # 4
 print $fn, '-\>', $new,"\n" and rename($fn, $new) or die; # 5

Grüße

CMБ

Hi,

mit dem „for“ klappt das schon in win98, denn meine jetzige
Bat sieht wie folgt aus:
Erf1.bat
for %%a in (*) do call c:\bat\erf2.bat %%a

Das mag sein, aber das ist was völlig anderes, als mein „for“-Befehl tat. Warum stellst du nicht die Ausgabe von „for /?“ hier rein?

Erf2.bat
@ECHO OFF
ren %1 %1.01
ren %1 %1.02
ren %1 %1.03
ren %1 %1.04
ren %1 %1.05
ren %1 %1.06
ren %1 %1.07
ren %1 %1.08
ren bis 50 habe ich editiert.

ah ok, so könnte man das auch machen…

Deine von mir geänderte Batch bringen Syntaxfehler. Jetzt bin
ich gespannt, den Rat von Dir zu bekommen.

Keinen Rat - soll ich raten? Welchen Syntaxfehler bringt sie an welcher Stelle? (Tip: Echo off auskommetieren).

Gruß

Sancho

hI,
Warum stellst du nicht die Ausgabe von „for /?“ hier rein?

Das verstehe ich nicht, was meinst Du damit.
Grüße von Klaus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Mahlzeit!

Warum stellst du nicht die Ausgabe von „for /?“ hier rein?

Das verstehe ich nicht, was meinst Du damit.

Öffne ein DOS-Fenster und tippe ein:

**for /?**

Da wird eine Hilfe in Form von Text ausgegeben. Diese möchte ich sehen. (Evtl. in eine Datei umleiten: for /? > forhilfe.txt).

Gruß

Sancho

Hallo Sancho,
wenn ich for /? eingebe kommt folgende Meldung:
Führt einen Befehl für jede Datei einer Dateigruppe einzeln aus.

FOR %Variable IN (Gruppe) DO Befehl [Parameter]

%Variable Ein ersetzbarer Parameter.
(Gruppe) Eine Gruppe mit mindestens einer Datei. Platzhalter sind zulässig.
Befehl Befehl, der für jede Datei ausgeführt wird.
Parameter Parameter und Optionen für den angegebenen Befehl.

Geben Sie bei einem Stapelverarbeitungsprogramm in der FOR-Anweisung
statt %Variable %%Variable an.
Gruß von Klaus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

wenn ich for /? eingebe kommt folgende Meldung:

na bitte, geht doch!

Führt einen Befehl für jede Datei einer Dateigruppe einzeln
aus. […]

Damit bestätigt sich meine Vermutung, daß Win98 „for /l“ nicht kennt. War das der Syntaxfehler? Wenn nicht: an welcher Stelle tritt er auf?

Gruß

Sancho