[issue45073] windows installer quiet installation targetdir escapes "quote"-symbol

2021-08-31 Thread Eryk Sun


Eryk Sun  added the comment:

A literal backlash has to be escaped by doubling it if it precedes a double 
quote, else it escapes the double quote character. This is how typical 
command-line argument parsing handles backslash in Windows [1]: 

* 2n backslashes followed by a quotation mark produce n backslashes
  followed by begin/end quote. This does not become part of the
  parsed argument, but toggles the "in quotes" mode.
* (2n) + 1 backslashes followed by a quotation mark again produce n
  backslashes followed by a quotation mark literal ("). This does
  not toggle the "in quotes" mode.
* n backslashes not followed by a quotation mark simply produce n
  backslashes.

For example:

import ctypes
shell32 = ctypes.WinDLL('shell32', use_last_error=True)
shell32.CommandLineToArgvW.restype = ctypes.POINTER(ctypes.c_wchar_p)
n = ctypes.c_int()

Escape the trailing backslash as a literal backslash:

>>> cmd = r'/quiet TargetDir="D:\pyt hon\\" AssociateFiles=0'
>>> args = shell32.CommandLineToArgvW(cmd, ctypes.byref(n))
>>> args[:n.value]
['/quiet', 'TargetDir=D:\\pyt hon\\', 'AssociateFiles=0']

Escape the double quote as a literal double quote:

>>> cmd = r'/quiet TargetDir="D:\pyt hon\" AssociateFiles=0'
>>> args = shell32.CommandLineToArgvW(cmd, ctypes.byref(n))
>>> args[:n.value]
['/quiet', 'TargetDir=D:\\pyt hon" AssociateFiles=0']

---

[1] 
https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw

--
components: +Windows
nosy: +eryksun, paul.moore, steve.dower, tim.golden, zach.ware

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue45073] windows installer quiet installation targetdir escapes "quote"-symbol

2021-08-31 Thread DMI-1407


New submission from DMI-1407 :

If the windows installer (Python 3.8.9 64bit exe) is run in quiet mode and the 
TargetDir option is used, then the last quote (") symbol gets escaped if the 
path ends with an backslash (\).

Example: /quiet TargetDir="D:\pyt hon\" AssociateFiles=0
Result: TargetDir=hon\" AssociateFiles=0
this raises the error that the path contains a invalid character... (the quote 
ofc)

Example: /quiet TargetDir="D:\pyt hon" AssociateFiles=0
Result: installs correctly


so in general "D:\pyt hon" indicates a file thats named "pyt hon" where "D:\pyt 
hon\" indicates a folder.
whatever "D:\pyt hon\" should be valid and i dont understand why the first 
backslash does not escape the p and leads to "D:pyt hon" ...

its really annoying, pls do at least write a notice into the docs that the 
installer behaves like this. :/

--
components: Installation
messages: 400809
nosy: DMI-1407
priority: normal
severity: normal
status: open
title: windows installer quiet installation targetdir escapes "quote"-symbol
type: behavior
versions: Python 3.8

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com