https://bugs.winehq.org/show_bug.cgi?id=44373
Bug ID: 44373 Summary: cmd's %0 path variables (e.g. %~dp0) don't match those of Windows (w.r.t. case and quoting) Product: Wine Version: 3.0-rc6 Hardware: x86 OS: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: cmd Assignee: wine-bugs@winehq.org Reporter: ryan.prichard@gmail.com Distribution: ---
I'm filing this issue at Fabian Maurer's suggestion, after filing https://bugs.winehq.org/show_bug.cgi?id=44369.
When %0 starts with a quote character, Windows tends to evaluate the %0 path variables (%~d0, %~p0, ...) strangely. I think the Wine behavior makes more sense, but it could also make sense to match Windows bug-for-bug.
Test program (you might have to fix up the C:\bin for your machine):
C:>mkdir Bin
C:\Bin\ShowArg0.Cmd:
@echo [%0] -------------------- [%~d0] [%~p0] [%~n0] [%~x0]
C:\Bin\RunScript.Cmd
@echo off setlocal set PATH=C:\bin;%PATH% cd \ echo --- Wine and Windows roughly do the same thing. call showarg0 call SHOWARG0 call showarg0.cmd call SHOWARG0.CMD call C:\bin\showarg0 call C:\bin\showarg0.cmd call c:\bin\showarg0.CMD call showarg0".cmd" call showarg0."cmd" call showarg0.c"md" call s"ho"warg0.cmd call s"ho"warg0 call "C:\bin\showarg0.cmd" call "c:\bin\showarg0.CMD" echo --- Wine and Windows diverge here. call "showarg0" call "SHOWARG0" call "showarg0.cmd" call "SHOWARG0.CMD" call "showarg0".cmd call "sho"warg0.cmd call "sho"warg0 call "C":\bin\showarg0.cmd call "C:"\bin\showarg0.cmd call "C:"bin\showarg0.cmd call "c:"bin\showarg0.CMD call "C:\bin\showarg0"
(I edited the script output to align the columns.)
Windows behavior (tested on XP and Win10.0.16299.125):
C:\Bin>RunScript --- Aside from case, Wine and Windows roughly do the same thing. --- ... Using c:\bin in PATH [showarg0] ----------------- [c:] [\Bin] [ShowArg0] [.Cmd] [SHOWARG0] ----------------- [c:] [\Bin] [ShowArg0] [.Cmd] --- ... Using C:\bin in PATH [showarg0] ----------------- [C:] [\Bin] [ShowArg0] [.Cmd] [SHOWARG0] ----------------- [C:] [\Bin] [ShowArg0] [.Cmd] [showarg0.cmd] ------------- [C:] [\Bin] [ShowArg0] [.Cmd] [SHOWARG0.CMD] ------------- [C:] [\Bin] [ShowArg0] [.Cmd] [C:\bin\showarg0] ---------- [C:] [\Bin] [ShowArg0] [.Cmd] [C:\bin\showarg0.cmd] ------ [C:] [\Bin] [ShowArg0] [.Cmd] [c:\bin\showarg0.CMD] ------ [c:] [\Bin] [ShowArg0] [.Cmd] [showarg0".cmd"] ----------- [C:] [\Bin] [ShowArg0] [.Cmd] [showarg0."cmd"] ----------- [C:] [\Bin] [ShowArg0] [.Cmd] [showarg0.c"md"] ----------- [C:] [\Bin] [ShowArg0] [.Cmd] [s"ho"warg0.cmd] ----------- [C:] [\Bin] [ShowArg0] [.Cmd] [s"ho"warg0] --------------- [C:] [\Bin] [ShowArg0] [.Cmd] ["C:\bin\showarg0.cmd"] ---- [C:] [\Bin] [ShowArg0] [.Cmd] ["c:\bin\showarg0.CMD"] ---- [c:] [\Bin] [ShowArg0] [.Cmd] --- Wine and Windows diverge here. ["showarg0"] --------------- [C:] [] [showarg0] [] ["SHOWARG0"] --------------- [C:] [] [SHOWARG0] [] ["showarg0.cmd"] ----------- [C:] [] [showarg0] [.cmd] ["SHOWARG0.CMD"] ----------- [C:] [] [SHOWARG0] [.CMD] ["showarg0".cmd] ----------- [C:] [] [showarg0"] [.cmd] ["sho"warg0.cmd] ----------- [C:] [] [sho"warg0] [.cmd] ["sho"warg0] --------------- [C:] [] [sho"warg0] [] ["C":\bin\showarg0.cmd] ---- [C:] [\C":\bin] [showarg0] [.cmd] ["C:"\bin\showarg0.cmd] ---- [C:] ["\bin] [showarg0] [.cmd] ["C:"bin\showarg0.cmd] ---- [C:] ["bin] [showarg0] [.cmd] ["c:"bin\showarg0.CMD] ---- [c:] ["bin] [showarg0] [.CMD] ["C:\bin\showarg0"] -------- [C:] [\Bin] [showarg0] []
Behavior on wine-3.0-rc6:
C:\Bin>RunScript --- Aside from case, Wine and Windows roughly do the same thing. --- ... Using c:\bin in PATH [showarg0] ----------------- [c:] [\bin] [showarg0] [.CMD] [SHOWARG0] ----------------- [c:] [\bin] [SHOWARG0] [.CMD] --- ... Using C:\bin in PATH [showarg0] ----------------- [C:] [\bin] [showarg0] [.CMD] [SHOWARG0] ----------------- [C:] [\bin] [SHOWARG0] [.CMD] [showarg0.cmd] ------------- [C:] [\bin] [showarg0] [.cmd] [SHOWARG0.CMD] ------------- [C:] [\bin] [SHOWARG0] [.CMD] [C:\bin\showarg0] ---------- [C:] [\bin] [showarg0] [.CMD] [C:\bin\showarg0.cmd] ------ [C:] [\bin] [showarg0] [.cmd] [c:\bin\showarg0.CMD] ------ [c:] [\bin] [showarg0] [.CMD] [showarg0".cmd"] ----------- [C:] [\bin] [showarg0] [.cmd] [showarg0."cmd"] ----------- [C:] [\bin] [showarg0] [.cmd] [showarg0.c"md"] ----------- [C:] [\bin] [showarg0] [.cmd] [s"ho"warg0.cmd] ----------- [C:] [\bin] [showarg0] [.cmd] [s"ho"warg0] --------------- [C:] [\bin] [showarg0] [.CMD] ["C:\bin\showarg0.cmd"] ---- [C:] [\bin] [showarg0] [.cmd] ["c:\bin\showarg0.CMD"] ---- [c:] [\bin] [showarg0] [.CMD] --- Wine and Windows diverge here. ["showarg0"] --------------- [C:] [\bin] [showarg0] [.CMD] ["SHOWARG0"] --------------- [C:] [\bin] [SHOWARG0] [.CMD] ["showarg0.cmd"] ----------- [C:] [\bin] [showarg0] [.cmd] ["SHOWARG0.CMD"] ----------- [C:] [\bin] [SHOWARG0] [.CMD] ["showarg0".cmd] ----------- [C:] [\bin] [showarg0] [.cmd] ["sho"warg0.cmd] ----------- [C:] [\bin] [showarg0] [.cmd] ["sho"warg0] --------------- [C:] [\bin] [showarg0] [.CMD] ["C":\bin\showarg0.cmd] ---- [C:] [\bin] [showarg0] [.cmd] ["C:"\bin\showarg0.cmd] ---- [C:] [\bin] [showarg0] [.cmd] ["C:"bin\showarg0.cmd] ---- [C:] [\bin] [showarg0] [.cmd] ["c:"bin\showarg0.CMD] ---- [c:] [\bin] [showarg0] [.CMD] ["C:\bin\showarg0"] -------- [C:] [\bin] [showarg0] [.CMD]
I see two differences:
- In most cases, when a path starts with a quote, Windows somehow doesn't parse the path correctly and/or doesn't find the batch file in the PATH.
- As long as Windows *does* find the batch file, it uses the canonical case for the path, filename, and extension. It doesn't canonicalize the drive; instead it uses the drive from the PATH or %0. I also tested a SMB share on XP and Win10 (\nAs\nAs and \NaS\NaS), and Windows didn't canonicalize the server name or share name. (Maybe it never does.)