Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch Variable in Dateinamen

Frage Entwicklung Batch & Shell

Mitglied: alexander01

alexander01 (Level 1) - Jetzt verbinden

22.06.2009, aktualisiert 28.06.2009, 7798 Aufrufe, 16 Kommentare

Hallo, ich hatte vor Tagen schon mal mein Problem mit der batch-Datei geschildert, ich komme aber nicht weiter

hallo,

das Problem war: aus einer zeilenweise aufgebauten Datei möchte ich per batch-script bestimmte Zeilen auslesen (geplant: 4 bestimmte Zeilen), von den (4) selektierten Zeilen jeweils die ersten 7 Zeichen entfernen (abschneiden) und aus den verbleibenden Zeileninhalten den Dateinamen erstellen.

Mit eurer Hilfe (Danke !!) läuft nachstehendes Script erstmal sehr gut, aber es verwendet nur 2 Zeilen der Ausgangsdatei:

@echo off

set vz=k:\doc2\user\user5

if exist %vz%\oat_roh.bdt del %vz%\oat_roh.bdt
if exist %vz%\oat_fein.bdt del %vz%\oat_fein.bdt

for /f "tokens=1,* delims=:" %%i in ('findstr /n $ %vz%\pat.bdt') do @(for /L %%a in (6,2,8) do @if %%i==%%a @echo %%j>>%vz%"\oat_roh.bdt")

for /f "delims=" %%f in (%vz%\oat_roh.bdt) do call :sprung1 "%%f"
goto ende

:sprung1
set "Quelle=%~1"
set "Ziel=%Quelle:~7%"
@echo %Ziel%>>%vz%"\oat_fein.bdt"
goto :sprung2

:sprung2
set /p roh=<%vz%\oat_fein.bdt
for /f "skip=1 delims=" %%f in (%vz%\oat_fein.bdt) do set "fein=%roh%%%f"
goto :eof

:ende
start "WORD" /MAX "k:\Dokumente\F\%fein%.doc"

durch Anpassen der ersten for-Schleife (4,2,10) gelingt es mir, die 4 betreffenden Zeilen in die "oat_roh" zu schreiben. Es gelingt auch, von diesen 4 Zeilen jeweils die ersten 7 Zeichen zu entfernen und in die "oat_fein" zu schreiben. Es gelingt mir aber nicht, diese 4 Zeilen zu einem Dateinamen zu formen. Es wird noch verrückter: der Dateiname sollte in der Reihenfolge "Zeile6Zeile8_Zeile10_Zeile4" erstellt werden (wäre aber nicht zwingend nötig, alternativ wäre die Reihenfolge "Zeile4Zeile6Zeile8Zeile10" möglich)

Ich wäre über Hinweise / Hilfe dankbar !

alexander
Mitglied: pieh-ejdsch
23.06.2009 um 10:25 Uhr
Hallo Alexander. wieso fängst Du denn einen neuen Thread an? Naja egal...

Bitte setze deinen (Batch-)Code wenn möglich in Code Zeilen um diesen besser zu kopieren zur weiteren Bearbeitung durch andere Forumbenutzer. Danke

<code> Meine Batch Zeilen </code>

Achtung ungetestet bitte Feedback geben!


01.
@echo off & setlocal enabledelayedexpansion 
02.
:anf 
03.
for %%i in (5 7 9 3) do call :read %%i 
04.
if not defined clean (set clean=1 & goto :anf ) 
05.
start "WORD" /MAX "k:\Dokumente\F\%5%%7%_%9%_%3%.doc" & goto :eof 
06.
:read 
07.
if defined clean set %1=!%1:~7! & goto :eof 
08.
for /f "usebackq skip=%1 tokens=*" %%i in ("k:\doc2\user\user5\pat.bdt") do set %1=%%i & goto :eof
liest Zeile 6; 8; 10 und 4 aus
kann auch in der ersten FORschleife eine andere Reihenfolge (3 5 7 9) sein!
ist nur der Übersicht halber so geschrieben.
entfernt die ersten 7 Zeichen und öffnet wie angegeben das Dokument.

Gruß Phil
Bitte warten ..
Mitglied: alexander01
23.06.2009 um 14:19 Uhr
Hallo, Phil

zuerst vielen Dank für Deine Mühe!

das Script will die Datei "...\%793eof" öffnen, dies mißlingt natürlich.

Die Zeilenfragmente werden offensichtlich nicht richtig übergeben.

Hast Du eine Idee?

Gruß

Alexander
Bitte warten ..
Mitglied: pieh-ejdsch
23.06.2009 um 19:10 Uhr
so habs getestet müsste jetzt gehen

01.
@echo on & setlocal enabledelayedexpansion 
02.
:anf 
03.
for %%i in (5 7 9 3) do call :read %%i 
04.
if not defined read (set read=1 & goto :anf ) 
05.
start "WORD" /MAX "k:\Dokumente\F\%File%.doc" 
06.
goto :eof 
07.
:read 
08.
set Nr=%1 
09.
if not defined read goto :readin 
10.
if %1 == 9 set Ustrich=1 
11.
if not defined Ustrich (set "File=%File%!%Nr%:~ 7!") else set "File=%File%_!%Nr%:~ 7!" & goto :eof 
12.
:readin 
13.
for /f "usebackq skip=%1 tokens=*" %%i in ("k:\doc2\user\user5\pat.bdt") do set %Nr%=%%i & goto :eof
lag wohl an den vielen %%
keine Ahnung?
Bitte warten ..
Mitglied: alexander01
23.06.2009 um 21:25 Uhr
na mensch, SUPER !

Danke!

ein kleiner Schönheitsfehler: nach jedem Zeilenfragment folgt ein Leerzeichen:

"Z1 Z2 _Z3 _Z4 "


kann man daraus

"Z1Z2_Z3_Z4" machen?

aber ich bin glücklich auch so!

danke

Alexander
Bitte warten ..
Mitglied: pieh-ejdsch
24.06.2009 um 00:59 Uhr
da fehlen doch tatsächlich ein paar Gänsefüschen!
was das wieder einmal ausmacht.

wenn Du Irgenwelche Variablen setzt und auf der selben Zeile noch weiteren Code hast ( mit Befehlverkettung & ...) dann setzt Du immer Gänsefüschen.
Alternativ dazu hinter den set Befehl das & direkt "daranklatschen" ohne leerzeichen...

Muss ich gleich mal in meine BatchVariablen Anleitung eintragen..!

und zwar fehlte es in Zeile 13
Hier nochmal mit "Umgebenden"

  • so hier ist die:
    mehrere Zeilen aus einer Datei in Unterschiedlicher Reihenfolge auslesen und die ausgelesenen Zeilen ohne die ersten 7 Zeichen jeder Zeile aneinanderfügen sowie ab einer bestimmten Zeile Unterstriche einfügen und einem Programm als Dateiname Übergeben .bat

01.
@echo on & setlocal enabledelayedexpansion 
02.
:anf 
03.
for %%i in (5 7 9 3) do call :read %%i 
04.
if not defined read (set read=1 & goto :anf ) 
05.
start "WORD" /MAX "k:\Dokumente\F\%File%.doc" 
06.
goto :eof 
07.
:read 
08.
set Nr=%1 
09.
if not defined read goto :readin 
10.
if %1 == 9 set Ustrich=1 
11.
if not defined Ustrich (set "File=%File%!%Nr%:~ 7!") else set "File=%File%_!%Nr%:~ 7!" & goto :eof 
12.
:readin 
13.
for /f "usebackq skip=%1 tokens=*" %%i in ("k:\doc2\user\user5\pat.bdt") do set "%Nr%=%%i" & goto :eof
Gruß Phil
Bitte warten ..
Mitglied: alexander01
24.06.2009 um 23:02 Uhr
Phil, danke für Deine Hilfe, es läuft!

Danke

Alexander
Bitte warten ..
Mitglied: pieh-ejdsch
25.06.2009 um 17:58 Uhr
Hallo alexander01,

ich habe mir mal erlaubt Deine Frage einfach hier wieder einzusetzten, da diese hier bestimmt besser aufgehoben ist und der Überblick behalten wird. ausserdem betrifft die Frage das Thema.
Zitat von alexander01:
ich brauche das Script für zwei verschiedene Vorgänge, bei einem muß hinter Zeilenfragment 1 ein Komma und ein Leerzeichen, danach folgt Fragment 2
also: Fragment1, Fragment2__Fragment3
wie bekomme ich ein ", " (= Komma + Leerzeichen) in den String?
set "File=%File%, !%Nr%:~7!" funktioniert nicht,
set "File=%File%_ !%Nr%:~7!" funktioniert hingegen schon. Sicher wird das Komma falsch interpretiert.
... hierzu eine Idee?
Alexander
Bitte warten ..
Mitglied: alexander01
28.06.2009 um 20:51 Uhr
Hallo, Phil

meine Versuche, im Dateinamen ein Komma gefolgt von einem Leerzeeichen unterzubringen, scheitern.

01.
 
02.
@echo on & setlocal enabledelayedexpansion  
03.
 
04.
:anf  
05.
for %%i in (5 7 3) do call :read %%i  
06.
if not defined read (set read=1 & goto :anf )  
07.
start "WORD" /MAX "k:\Dokumente\F\%File%.doc"  
08.
goto :eof  
09.
 
10.
:read 
11.
set Nr=%1 
12.
if not defined read goto :readin 
13.
if %1 == 5 (set "File=%File%!%Nr%:~7!" & goto :eof 
14.
if %1 == 7 (set "File=%File%, !%Nr%:~7!" & goto :eof 
15.
if %1 == 3 (set "File=%File%__!%Nr%:~7!" & goto :eof 
16.
 
17.
readin  
18.
for /f "usebackq skip=%1 tokens=*" %%i in ("k:\doc2\user\user5\pat.bdt") do set "%Nr%=%%i" & goto :eof 
19.
 
nach dem ersten Zeilenfragment (=5) sollen ein Komma und ein Leerzeichen erscheinen, danach Fragment 2 (=7), gefolgt von "__" und danach Fragment3 (=3).

Setze ich statt des "," im obigen Beispiel irgendein anderes Zeichen ein, klappt es, es scheitert also am Komma.

Wer kann helfen?

Danke

Alexander
Bitte warten ..
Mitglied: pieh-ejdsch
28.06.2009 um 23:49 Uhr
Hallo Alexander,
Es scheitert keinesfalls am Komma.

Du hast die Klammern nicht abgeschlossen. Das ist ein wichtiges Detail und sollte nicht vergessen werden. Immer wenn eine Klammer geöffnet wird muss diese auch irgendwo wieder Geschlossen werden sonst kommt nur eine Fehlermeldung. Die wirst Du aber vllt nicht gesehen haben, weil sich das Fenster zu schnell geschlossen hat. Klammern fügen Befehle zusammen oder grenzen andere Befehle aus. Also zählst Du am besten von Befehlen: alle aufgehenden Klammern als PositiveWerte und alle abschliesenden Klammern als negative Werte (ausgeschlossen sind davon die Klammern aus Zeichenfolgen und gesetzten Variablen, wenn diese nicht als Befehlersatz eingesetzt werden) und dieser Wert sollte dann 0 ergeben.
Weil Du hinter dem IF kein ELSE Klausel hast, benötigst Du in Deinem Fall diese Klammer nicht.

Das & goto :eof benötigst Du eigentlich nur einmal auf der 15. Zeile oder einmal auf der 16. Zeile als goto :eof
In Deinem Fall kann es aber auch auf Zeile 13 bis 15 stehenbleiben. oder gar auch mit dem Anfang Deiner Ursprünglich dagelassenen EingangsKlammer am jeweiligen Zeilenende mit einer Abschliessenden Klammer wieder geschlossen werden.
der Effekt ist in Deiner Batch immer der selbe, da goto : readin dieses goto :eof Überspringt und durch die einzelnen Zeilenvergleiche nur für die passende Zeile die jeweilige Variable gesetzt wird.

in der Zeile 13 muss nicht unbedint hinter dem Gleichheitszeichen %File% stehen, weil ja die Variable File zu diesem Zeitpunkt noch gar nicht Existiert. Aber in diesem Fall kann es stehen bleiben es sollte nur stehenbleiben wenn mit einer einzigen Zeile die Komplette Variable (der Dateiname) generiert wird (siehe meinen Vorherigen Kommentar Code-Zeile 11.).


Das nächste ist die Sprungmarke :readin
diese muss um am Zeilenbeginn als Sprungmarke erkannt zu werden immer mit einem Doppelpunkt beginnen ansonsten wird die Zeile als Befehl Eingelesen. Im Gegensatz dazu kann man den Doppelpunkt hinter GOTO weglassen. dieser ist nicht unbedingt erforderlich aber wird meistens der Übersichtlichkeit halber in der Batch hinter GOTO gesetzt.

01.
 
02.
@echo on & setlocal enabledelayedexpansion  
03.
 
04.
:anf  
05.
for %%i in (5 7 3) do call :read %%i  
06.
if not defined read (set read=1 & goto :anf )  
07.
start "WORD" /MAX "k:\Dokumente\F\%File%.doc"  
08.
goto :eof  
09.
 
10.
:read 
11.
set Nr=%1 
12.
if not defined read goto :readin 
13.
if %1 == 5 set "File=%File%!%Nr%:~7!" & goto :eof 
14.
if %1 == 7 set "File=%File%, !%Nr%:~7!" & goto :eof 
15.
if %1 == 3 set "File=%File%__!%Nr%:~7!" & goto :eof 
16.
 
17.
:readin  
18.
for /f "usebackq skip=%1 tokens=*" %%i in ("k:\doc2\user\user5\pat.bdt") do set "%Nr%=%%i" & goto :eof
Gruß Phil
Bitte warten ..
Mitglied: alexander01
29.06.2009 um 23:17 Uhr
oh nein, Phil,

Entschuldigung!

Fehler in der Übernahme!

01.
 
02.
if %1 == 5 (set "File=%File%!%Nr%:~7!" & goto :eof ) 
03.
if %1 == 7 (set "File=%File%, !%Nr%:~7!" & goto :eof)  
04.
if %1 == 3 (set "File=%File%__!%Nr%:~7!" & goto :eof)  
05.
 
auch den Doppelpunkt vor "readin" gibt es.

so sieht es aus.

ich denke und hoffen, die schließende Klammer steht richtig am Ende.

das mit dem Komma muß eine andere Ursache haben.

Gruß

Alexander
Bitte warten ..
Mitglied: pieh-ejdsch
30.06.2009 um 19:17 Uhr
hallo alex,
ich hatte vergessen zu erwähnen, dass eine Sprungmarke genauso heist wie sie bis zum ende der Zeichenfolge bezeichnet ist. das bedeutet, wenn eine Klammer direkt an den Namen der Sprungmarke OHNE Leerzeichen Angefügt wird wird ein anderer Sprungmarkenname daraus.

Wenn Du also mehrere Befehle mit Klammern zusammmenfügst achte darauf, dass zwischen einem goto :Sprungmarke und einer Abschliesenden Klammer ein Leerzeichen eingefügt ist.
also genau wie Deine Zeile 02. - die ist richtig.

Wieso hast Du nicht den Code Von meinem vorherigen Thread genommen?
Der war doch ok so?

(Da kam wohl Dein Ergeiz hinzu, um es selbst zu probieren)

Gruß Phil
Bitte warten ..
Mitglied: alexander01
30.06.2009 um 23:03 Uhr
Hallo, Phil,

nein, das Script aus dem anderen Thread lief nicht, ich hatte pausen eingebaut, konnte den Fehler aber nicht eingrenzen..
die Syntax mit den Klammern habe ich beachtet, es stehen Leerzeichen drin. Trotzdem akzeptiert das Script das Komma nicht.

Gruß, Alexander
Bitte warten ..
Mitglied: pieh-ejdsch
02.07.2009 um 22:15 Uhr
hallo Alexander;

Thread - ich meine Doch Kommentar.

Wieviele Zeilen hat Deine pat.bdt?
Wirklich sieben?
Oder ist grerade die siebte Zeile leer bzw unter acht Zeichen lang?
Bitte Überprüfe das mal!


denn bei mir Funktioniert das script.
01.
@echo on & setlocal enabledelayedexpansion  
02.
:anf  
03.
for %%i in (5 7 3) do call :read %%i  
04.
if not defined read (set read=1 & goto :anf )  
05.
start "WORD" /MAX "k:\Dokumente\F\%File%.doc"  
06.
goto :eof  
07.
:read 
08.
set Nr=%1 
09.
if not defined read goto :readin 
10.
if %1 == 5 set "File=%File%!%Nr%:~7!" & goto :eof 
11.
if %1 == 7 set "File=%File%, !%Nr%:~7!" & goto :eof 
12.
if %1 == 3 set "File=%File%__!%Nr%:~7!" & goto :eof 
13.
:readin  
14.
for /f "usebackq skip=%1 tokens=*" %%i in ("k:\doc2\user\user5\pat.bdt") do set "%Nr%=%%i" & goto :eof
Bitte warten ..
Mitglied: alexander01
03.07.2009 um 06:27 Uhr
Guten Morgen, Phil,

meine pat.bdt hat immer 23 Zeilen, in bestimmten Zeilen stehen bestimmte Angaben, aber in jeder zeile erst ab dem 8. Zeichen , davor stehen Zahlen.
Aus den Zeilen 5, 7 und 3 möchte ich wie oben gesagt, einen Dateinamen bauen "5, 7__3".
Ich prüfe nochmal genau die Syntax zwischen Deinem Script oben und meinem.

Danke

Alexander
Bitte warten ..
Mitglied: pieh-ejdsch
03.07.2009 um 22:31 Uhr
hallo alexander,
Irgendwie ab ich da vorhin etwas falsch angegeben. (zeile sieben müsste - zeile acht heissen)

es werden natürlich die jeweils angegebenen Zeilen Übersprungen und die nächste zur Namensbildung genommen.

Gruß Phil
Bitte warten ..
Mitglied: alexander01
04.07.2009 um 13:07 Uhr
Hallo, Phil,

ich freue mich, ich habe den Fehler gefunden!

1. ich habe "echo on" laufen lassen (warum nicht früher??) und festgestellt, das der dateiname richtig gebildet wird
2. ich habe den letzten auszuführenden Befehl korrigiert:

von:
call explorer.exe /e,k:\............\%File%

auf:
call explorer.exe /e,"k:\............\%File%"

und: es läuft!

Danke nochmals für Deine viele Mühe und die Ideen!

Gruß
Alexander
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Variable setzten mit Leerzeichen (3)

Frage von Marlon1 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Batch & Shell
gelöst In Batch variable DOS-Funktion von "größer" und "kleiner" Zeichen unterdrücken (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...