[Nim] paramStr() / getFileInfo() zickt rum...

  • Ich verzweifle hier gerade... entweder habe ich ein meterdickes Brett vor dem Kopf, oder paramStr()/getFileInfo()/splitFile() sind tatsächlich fehlerhaft.

    Eigentlich will ich nur wissen, ob der übergebene Parameter ein Verzeichnis oder ein File ist... dafür habe ich folgendes Script geschrieben:

    Das Problem dabei ist nun, dass ein Pfad keinen abschließenden Backslash haben darf, weil getFileInfo() sonst meckert und das Script abgebrochen wird. Hinzu kommt, das paramStr() den abschließenden Backslash nicht anzeigt, wobei getFileInfo() diesen aber dennoch bemeckert und deswegen das Script abbricht. Beim zweiten Parameter kommt der nächste Fehler bei splitFile()... da steht bei name = ... ein ", doch wenn das erste ausgefiltert wird, sollte das zweite auch nicht da sein. Und mit ' als Begrenzer geht es ja mal gar nicht...

    Hier der Aufruf des Scripts, einmal mit "" und einmal mit '' als Begrenzer, und die Ausgabe:

    Spoiler anzeigen

    M:\Temp>Test.exe "f:\Audio\MP3\Top\Top 40 Oldies Forever" "f:\Audio\MP3\Top\Top 40 Oldies Forever\"

    paramCount() = 2

    paramStr(0) = Test.exe

    dir =

    name = Test

    ext = .exe

    oFileInfo.kind = pcFile

    paramStr(1) = f:\Audio\MP3\Top\Top 40 Oldies Forever

    dir = f:\Audio\MP3\Top

    name = Top 40 Oldies Forever

    ext =

    oFileInfo.kind = pcDir

    paramStr(2) = f:\Audio\MP3\Top\Top 40 Oldies Forever"

    dir = f:\Audio\MP3\Top

    name = Top 40 Oldies Forever"

    ext =

    c:\Users\ghost\NIM\@Bitnugger\Test.nim(11) Test

    C:\Users\ghost\scoop\apps\nim\current\lib\pure\os.nim(3156) getFileInfo

    C:\Users\ghost\scoop\apps\nim\current\lib\pure\includes\oserr.nim(94) raiseOSError

    Error: unhandled exception: Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.

    Additional info: "f:\\Audio\\MP3\\Top\\Top 40 Oldies Forever\"" [OSError]

    M:\Temp>Test.exe 'f:\Audio\MP3\Top\Top 40 Oldies Forever' 'f:\Audio\MP3\Top\Top 40 Oldies Forever\'

    paramCount() = 8

    paramStr(0) = Test.exe

    dir =

    name = Test

    ext = .exe

    oFileInfo.kind = pcFile

    paramStr(1) = 'f:\Audio\MP3\Top\Top

    dir = 'f:\Audio\MP3\Top

    name = Top

    ext =

    c:\Users\ghost\NIM\@Bitnugger\Test.nim(11) Test

    C:\Users\ghost\scoop\apps\nim\current\lib\pure\os.nim(3156) getFileInfo

    C:\Users\ghost\scoop\apps\nim\current\lib\pure\includes\oserr.nim(94) raiseOSError

    Error: unhandled exception: Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.

    Additional info: "\'f:\\Audio\\MP3\\Top\\Top" [OSError]

    M:\Temp>

    Ganz so perfekt ist Nim dann wohl doch nicht...

    Und was mache ich jetzt?

    • Offizieller Beitrag

    "f:\Audio\MP3\Top\Top 40 Oldies Forever" "f:\Audio\MP3\Top\Top 40 Oldies Forever\"

    Das ist ja auch nicht zulässig (auch in anderen Sprachen nicht). Mit dem Backslash am Ende maskierst du den Stringbegrenzer, sodass dieser statt Backslash am Ende des Parameters verbleibt.

  • Das geht auch einfacher:

    Ok, ich sag mal ja... wobei das aber nichts daran ändert, das es mit paramStr()/getFileInfo()/splitFile() nicht funktioniert und ich auch mit PathIsDirectoryA() nicht zum Ziel komme.

    Wenn ich PathIsDirectoryA() einen Pfad mit abschließenden Backslash übergebe, bekomme ich ein false und let sPath kann ich da eh nicht nehmen, weil ich den Pfad von paramStr() nehmen muss, da ich ja die Parameter auswerten will, mit denen die Exe aufgerufen wurde. Wie überprüfe ich also nun, ob der in paramStr() enthaltene Pfad einen abschließenden Backslash hat, wenn dieser doch von paramStr() unterschlagen wird?

    Was ich bräuchte, wäre eine alternative für paramStr()... grrr, das kann einem echt die Lust an Nim rauben!

  • Das ist ja auch nicht zulässig (auch in anderen Sprachen nicht). Mit dem Backslash am Ende maskierst du den Stringbegrenzer, sodass dieser statt Backslash am Ende des Parameters verbleibt.

    Verstehe... boar, wie tücke ist das denn... wird ein Pfad mit abschließenden Backslash in "" übergebe, muss ich prüfen, ob am Ende des Pfades ein " steht... das vordere wurde ja korrekt ausgefiltert... wird er ohne "" übergeben, sehe ich den Backslash in paramStr().

    Nicht zulässig... dann sag das mal AutoIt. ,-)

    Danke - du hast mir das Leben gerettet... wollte schon von der Brücke springen. 8o

  • Hier die Lösung: