[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: RE: Issue using quoted arguments on os.execute() on Windows
- From: Thijs Schreijer <thijs@...>
- Date: Sun, 17 Nov 2013 22:47:15 +0000
> -----Original Message-----
> From: lua-l-bounces@lists.lua.org [mailto:lua-l-bounces@lists.lua.org] On
> Behalf Of Peter Cawley
> Sent: zondag 17 november 2013 23:30
> To: Lua mailing list
> Subject: Re: Issue using quoted arguments on os.execute() on Windows
>
> I suspect that `os.execute(cmd)`, via the C runtime, ends up executing
> `"cmd.exe /C " .. cmd`.
>
> If you run `cmd.exe /?`, then part of the help text is the following:
> --8x--------------------------------------------------
> If /C or /K is specified, then the remainder of the command line after
> the switch is processed as a command line, where the following logic is
> used to process quote (") characters:
>
> 1. If all of the following conditions are met, then quote characters
> on the command line are preserved:
>
> - no /S switch
> - exactly two quote characters
> - no special characters between the two quote characters,
> where special is one of: &<>()@^|
> - there are one or more whitespace characters between the
> two quote characters
> - the string between the two quote characters is the name
> of an executable file.
>
> 2. Otherwise, old behavior is to see if the first character is
> a quote character and if so, strip the leading character and
> remove the last quote character on the command line, preserving
> any text after the last quote character.
> --8x--------------------------------------------------
>
> The end effect of these rules is that if you want the sensible
> behaviour of quotes being preserved, and you want this consistently,
> then your command line mustn't start with a quote character. To that
> end, my personal approach is to do `os.execute("type NUL && "..cmd)`
> rather than `os.execute(cmd)`.
Thanks! Lifesaver, I spent almost a day on tracking this down.
I had just devised the following workaround; replace the full path by its short version;
--8x--------------------------------------------------
function get_shortname(file)
local cmd = [[for %f in ("]]..file..[[") do @echo %~df%~spf%~snf%~sxf]]
local pipe = io.popen(cmd)
local short = pipe:read("*a")
pipe:close()
return short
end
--8x--------------------------------------------------
So I wouldn't have to quote the command itself. But yours is better and universally applicable (I can monkeypatch os.execute() with that, and rest assured it works everywhere).
Thijs