Post by Ulrich F. HeidenreichPost by Dirk Wolfgang GlompPost by Ulrich F. HeidenreichMein Lösungsansatz wäre - vorausgesetzt, ihr Name ist eindeutig und
dir c:\*.bat /s /b /v | find "%0"
Da der OP vermutlich ein XP+ benutzt ist das Problem wohl gar
nicht vorhanden, aber in echtem DOS würde ich zuerst %0 in
seine vier Bestandteile zerlegen:
Laufwerk, Pfad, Name und Erweiterung
Falls Laufwerk/Pfad nich leer sind, ist der Ort gefunden.
Ansonsten nach Name.bat suchen:
if exist %nam%.bat echo .\%nam%.bat
for %%i in (%PATH%) do if exist %%i\%nam%.bat echo %%i\%nam%.bat
Post by Ulrich F. HeidenreichPost by Dirk Wolfgang Glomp....uaaah EDLIN wie grausam...
Nenne mir andere DOS-Bordmittel, um aus "C:\pfad\dateiname" den
"C:\pfad" zu extrahieren.
Soweit ich mich erinnere, war EDLIN zwar bei NT und W2k aber
nicht bei DOS6 oder DOS7 (Win98) dabei.
Hier eine 15 Jahre alte batch Datei die die Zerlegung macht
(das waren noch Zeiten, da hab ich noch von Hand Assembler-
programme geschrieben, die nur opcodes im ASCII-Bereich
enthalten):
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
set x=%1
if exist s_r.com goto l0
echo j_^h`0X-//***@X(E4(E8(EE(EP(EU(E](Eb,`,`0E50EB(EJ0EMYP>s_r.com
echo "X(Ee0Ef(Ei0EsQI[SZR2T!JJJxGh06X500ZRC2P$:U=tDM!u1Q[QP>>s_r.com
echo "XZM!td8D#uwQZM!tY:E=tTPZC:]5sL8T$t(KyeM!xaCSX5``5`,M!>>s_r.com
:l0
set drv=
set pat=
set ext=
echo .%x%| s_r.com .:set drv=>s_r.bat
if not errorlevel 1 goto l1
echo.>>s_r.bat
echo %x%| s_r.com :,set x=>> s_r.bat
echo.>>s_r.bat
call s_r.bat
:l1
echo .%x%|s_r.com .\set pat=%pat%> s_r.bat
if not errorlevel 1 goto l2
echo \>>s_r.bat
echo %x%| s_r.com \,set x=>> s_r.bat
echo.>>s_r.bat
call s_r.bat
goto l1
:l2
echo .%x%| s_r.com ..set nam=> s_r.bat
if not errorlevel 1 goto l3
echo.>>s_r.bat
echo %x%| s_r.com ..set ext=>> s_r.bat
:l3
echo.>>s_r.bat
call s_r.bat
echo drive= %drv%
echo path = %pat%
echo file = %nam%
echo ext = %ext%
Post by Ulrich F. HeidenreichWie wär's stattdessen mit einer Hilfe zu dem Symptom, daß ein "echo %0"
mal nur den Dateinamen und mal den kompletten Pfad liefert? Wenn es
*immer* Letzteres täte, wäre des OPs Aufgabe ja gelöst ...
Steht in %0 nicht genau der Aufruf des Programms, d.h. mit Pfad
falls der Pfad im Aufruf angegeben wurde und sonst halt ohne?
Oder kannst du ein gegenbeispiel geben.
Hier noch der Sourcecode des Assemblerprogramms:
; liest von der cmdline die 2 Zeichen: ANF und END (die ersten
; beiden Zeichen nach dem ersten blank nach dem Programmnamen).
; Die restlichen Zeichen der cmdline werden auf stdout ausgegeben.
; Anschliessend werden Zeichen von stdin gelesen, bis das Zeichen ANF
; kommt. Alle darauf folgenden Zeichen werden nach stdout
; ausgegeben, bis Zeichen END oder CR oder EOF kommt. Dieses Zeichen
; wird nicht mehr ausgegeben. Die Anzahl der END-Zeichen zwischen
; dem ANF-Zeichen und CR bzw. EOF wird als errorlevel ausgegeben.
@=$100
moveq.w #$5f,-(sp)
move.w (sp)+,r5 ; r5=$5f
move.w #$3060,-(sp)
move.w (sp)+,r0
sub.w #$3060-$131,r0
move.w r0,-(sp)
move.w (sp)+,r6 ; r6=$131
moveq.w #$40,-(sp)
move.w (sp)+,r0 ; r0=$40
sub.b r0,b1+1-$131.b(r6.w)
sub.b r0,b2+1-$131.b(r6.w)
sub.b r0,b3+1-$131.b(r6.w)
sub.b r0,b4+1-$131.b(r6.w)
sub.b r0,b5+1-$131.b(r6.w)
sub.b r0,b6+1-$131.b(r6.w)
sub.b r0,b7+1-$131.b(r6.w)
sub.b #$60,r0
sub.b #$60,r0 ; r0=$80
eor.b r0,c1-$131.b(r6.w)
eor.b r0,c2-$131.b(r6.w)
sub.b r0,c3+1-$131.b(r6.w)
eor.b r0,c4-$131.b(r6.w)
move.w (sp)+,r2 ; r2=0
move.w r0,-(sp)
or.w #$220a,r0 ; crlf
move.w (sp)+,r0
sub.b r0,c5+1-$131.b(r6.w)
eor.b r0,c6-$131.b(r6.w)
sub.b r0,c7+1-$131.b(r6.w)
eor.b r0,c8-$131.b(r6.w)
move.w r2,-(sp)
dec.w r2 ; r2=-1
move.w (sp)+,r3 ; r3=0
move.w r3,-(sp)
move.w (sp)+,r1 ; r1=0
move.w r1,-(sp)
eor.b $21.b(r5.w),r1 ; cmdline length
dec.w r1
dec.w r1
dec.w r1
bmi.b g5 ; at least 3 byte
move.w #$3630,-(sp)
move.w (sp)+,r0
eor.w #$3030,r0 ; r0=$0600
g1: move.w (sp)+,r1 ; r1=0
move.w r1,-(sp)
inc.w r3
eor.b $24.b(r3.w,r5.w),r1 ; next byte from cmdline
cmp.b a1-$131.b(r6.w),r1 ; = CR ?
b1: beq.b g2+$40
c1: dc.b $cd^$80,$21 ; trap #$21
b2: bne.b g1+$40 ; bne = br
g2: move.w r2,-(sp)
move.w (sp)+,r3 ; r3=-1
move.w r2,-(sp)
move.w r0,-(sp)
a1: or.w #$220a,r0 ; crlf
move.w (sp)+,r0
move.w (sp)+,r1 ; r1=-1
g3: c2: dc.b $cd^$80,$21 ; trap #$21
b3: beq.b g5+$40 ; no more char
cmp.b r0,$23.b(r5.w) ; = START char
c3: bne.b g3+$80
g4: move.w r2,-(sp)
move.w (sp)+,r1 ; r1=-1
c4: dc.b $cd^$80,$21 ; trap #$21
b4: beq.b g5+$40 ; no more char
cmp.b a1-$131.b(r6.w),r0 ; = CR
b5: beq.b g5+$40
move.w r0,-(sp)
move.w (sp)+,r1
inc.w r3 ; suppose END char
cmp.b c1-$131.b(r6.w),r3 ; max $4c END char
b6: bhs.b g5+$40
cmp.b r1,$24.b(r5.w) ; = END char
b7: beq.b g4+$40
dec.w r3 ; was not END char
c5: bpl.b g4+$80 ; don't write after 1. END char
c6: dc.b $cd^$80,$21 ; trap #$21
c7: bmi.b g4+$80 ; bmi = br
g5: inc.w r3
move.w r3,-(sp)
move.w (sp)+,r0
eor.w #$6060,r0
eor.w #$2c60,r0 ; AH=$4c
c8: dc.b $cd^$80,$21 ; trap #$21