Página 1 de 2
[RESUELTO] La sintaxis del nombre del archivo... es incorrecta
Publicado: 25 de septiembre de 2018 - 15:38
por empbilly
Hola,
Creé un paquete para instalar el software Surfer 11. En este paquete también programé la opción de desinstalar versiones antiguas antes de instalar la nueva.
Después de ejecutarlo en el cliente, la salida del comando muestra el siguiente error:
Código: Seleccionar todo
Uninstalling old versions of surfer...
CalledProcessErrorOutput: Command [u'"C:\\ProgramData\\{5F3A4BBA-1519-45F2-9BF7-1E9924E32CAA}\\Surfer(11.1.719)_Installer.exe" REMOVE=TRUE MODIFY=FALSE'] returned non-zero exit status 1.
The syntax for the file name, directory name, or volume label is incorrect.
Paquete:
Código: Seleccionar todo
# -*- coding: utf-8 -*-
from setuphelpers import *
import os
uninstallkey = []
destdir = makepath(programfiles, "Golden Software", "Surfer 11", "AppData")
filedir = "%s\\Gradient.ini" % destdir
def install():
print('Uninstalling old versions of surfer...')
for soft in installed_softwares('Surfer'):
try:
run(WAPT.uninstall_cmd(soft['key']))
except ValueError:
print('An error occured on Surfer unninstalling!')
print('Uninstalling old versions of Surfer completed!')
print('installing Surfer')
install_msi_if_needed('surfer.msi')
if os.path.exists(destdir):
filecopyto("Gradient.ini", destdir)
if os.path.exists(filedir):
print("Gradient.ini copiado para %s" % destdir)
Re: La sintaxis del nombre del archivo... es incorrecta
Publicado: 25 de septiembre de 2018 - 15:46
por htouvet
Hola,
Parece que uninstall_cmd devuelve una lista que no está dividida correctamente.
El comando "run" puede tener como primer argumento una lista o una cadena. En el caso de una lista, el primer miembro debe ser el ejecutable y los siguientes son los argumentos del comando.
Entonces, si obtiene [u'"C:\\ProgramData\\{5F3A4BBA-1519-45F2-9BF7-1E9924E32CAA}\\Surfer(11.1.719)_Installer.exe" REMOVE=TRUE MODIFY=FALSE'] como valor de retorno de uninstall_cmd (es decir, una lista con un solo miembro), una forma de solucionarlo es tomar el primer argumento como cmd
Código: Seleccionar todo
# -*- coding: utf-8 -*-
from setuphelpers import *
import os
uninstallkey = []
destdir = makepath(programfiles, "Golden Software", "Surfer 11", "AppData")
filedir = "%s\\Gradient.ini" % destdir
def install():
print('Uninstalling old versions of surfer...')
for soft in installed_softwares('Surfer'):
try:
cmd = WAPT.uninstall_cmd(soft['key'])
if isinstance(cmd,list) and len(cmd) == 1:
cmd = cmd[0]
run(cmd)
except ValueError:
print('An error occured on Surfer unninstalling!')
print('Uninstalling old versions of Surfer completed!')
print('installing Surfer')
install_msi_if_needed('surfer.msi')
if os.path.exists(destdir):
filecopyto("Gradient.ini", destdir)
if os.path.exists(filedir):
print("Gradient.ini copiado para %s" % destdir)
Re: La sintaxis del nombre del archivo... es incorrecta
Publicado: 25 de septiembre de 2018 - 17:05
por empbilly
Hola htouvet, ¡¡¡gracias por la respuesta!!!
Hice el cambio, pero se produjo un error de tiempo de espera.
Ejecuté una prueba en la mano con el siguiente comando y la eliminé silenciosamente.
Código: Seleccionar todo
C:\ProgramData\{5F3A4BBA-1519-45F2-9BF7-1E9924E32CAA}>"Surfer(11.1.719)_Installer.exe" REMOVE=TRUE SILENT=TRUE MODIFY=FALSE
¿Cómo puedo pasar esta opción SILENT=TRUE como argumento?
Re: La sintaxis del nombre del archivo... es incorrecta
Publicado: 25 de septiembre de 2018 - 17:18
por htouvet
simplemente agréguelo al comando...
Código: Seleccionar todo
# -*- coding: utf-8 -*-
from setuphelpers import *
import os
uninstallkey = []
destdir = makepath(programfiles, "Golden Software", "Surfer 11", "AppData")
filedir = "%s\\Gradient.ini" % destdir
def install():
print('Uninstalling old versions of surfer...')
for soft in installed_softwares('Surfer'):
try:
cmd = WAPT.uninstall_cmd(soft['key'])
if isinstance(cmd,list) and len(cmd) == 1:
cmd = cmd[0]
if not 'SILENT=TRUE' in cmd:
cmd = cmd + ' SILENT=TRUE'
run(cmd)
except ValueError:
print('An error occured on Surfer unninstalling!')
print('Uninstalling old versions of Surfer completed!')
print('installing Surfer')
install_msi_if_needed('surfer.msi')
if os.path.exists(destdir):
filecopyto("Gradient.ini", destdir)
if os.path.exists(filedir):
print("Gradient.ini copiado para %s" % destdir)
Re: La sintaxis del nombre del archivo... es incorrecta
Publicado: 25 de septiembre de 2018 - 17:51
por empbilly
¡¡Fresco!!
Pero, si ejecuto manualmente vía cmd el comando:
Código: Seleccionar todo
C:\ProgramData\{5F3A4BBA-1519-45F2-9BF7-1E9924E32CAA}>"Surfer(11.1.719)_Installer.exe" REMOVE=TRUE MODIFY=FALSE SILENT=TRUE
se elimina muy rápido.
A través del script, se produce un error de tiempo de espera. Configuro un tiempo de espera de 180 segundos para la prueba.
Código: Seleccionar todo
Uninstalling old versions of surfer...
TimeoutExpired: Command '"C:\ProgramData\{5F3A4BBA-1519-45F2-9BF7-1E9924E32CAA}\Surfer(11.1.719)_Installer.exe" REMOVE=TRUE MODIFY=FALSE SILENT=TRUE' timed out after 180 seconds with output ''''
¿Algo anda mal con mi guión?
Re: La sintaxis del nombre del archivo... es incorrecta
Publicado: 26 de septiembre de 2018 - 13:05
por dcardon
Hola Elías,
empbilly escribió: ↑25 de septiembre de 2018 - 17:51
Pero, si ejecuto manualmente vía cmd el comando:
Código: Seleccionar todo
C:\ProgramData\{5F3A4BBA-1519-45F2-9BF7-1E9924E32CAA}>"Surfer(11.1.719)_Installer.exe" REMOVE=TRUE MODIFY=FALSE SILENT=TRUE
se elimina muy rápido.
A través del script, se produce un error de tiempo de espera. Configuro un tiempo de espera de 180 segundos para la prueba.
Código: Seleccionar todo
Uninstalling old versions of surfer...
TimeoutExpired: Command '"C:\ProgramData\{5F3A4BBA-1519-45F2-9BF7-1E9924E32CAA}\Surfer(11.1.719)_Installer.exe" REMOVE=TRUE MODIFY=FALSE SILENT=TRUE' timed out after 180 seconds with output ''''
¿Algo anda mal con mi guión?
¿Observa este comportamiento al ejecutar el script en PyScripter o mediante WAPTService? Si funciona con PyScripter, podría deberse a que este comando se ejecuta en el contexto "Sistema local" (WaptService se ejecuta como "Sistema local").
Salud,
Denis
Re: La sintaxis del nombre del archivo... es incorrecta
Publicado: 26 de septiembre de 2018 - 14:17
por empbilly
¿Observa este comportamiento al ejecutar el script en PyScripter o mediante WAPTService? Si funciona con PyScripter, podría deberse a que este comando se ejecuta en el contexto "Sistema local" (WaptService se ejecuta como "Sistema local").
Estoy ejecutando a través de WAPTService.
¿Hay alguna forma de solucionar este problema?
Re: La sintaxis del nombre del archivo... es incorrecta
Publicado: 26 de septiembre de 2018 - 15:16
por dcardon
Hola Empbilly,
empbilly escribió: ↑26 de septiembre de 2018 - 14:17
¿Observa este comportamiento al ejecutar el script en PyScripter o mediante WAPTService? Si funciona con PyScripter, podría deberse a que este comando se ejecuta en el contexto "Sistema local" (WaptService se ejecuta como "Sistema local").
Estoy ejecutando a través de WAPTService.
¿Hay alguna forma de solucionar este problema?
Debería intentar ejecutar el binario de desinstalación en el contexto del "sistema local". Para ello, puede instalar tis-ms-pstools y ejecutarlo
Para obtener un shell como "sistema local". Puedes usar el
Para comprobar si realmente se está ejecutando como SISTEMA, ejecute el binario de desinstalación.
Si funciona, puedes intentar iniciar pyscripter como "sistema local" y ver si la instalación del paquete se realiza de la misma manera que en tu contexto de usuario.
Salud,
Denis
Re: La sintaxis del nombre del archivo... es incorrecta
Publicado: 26 de septiembre de 2018 - 18:53
por empbilly
dcardon,
¿Cómo podría incluir "psexec..." en el script anterior?
Re: La sintaxis del nombre del archivo... es incorrecta
Publicado: 26 de septiembre de 2018 - 19:44
por dcardon
Hola Elías,
empbilly escribió: ↑26 de septiembre de 2018 - 18:53
dcardon,
¿Cómo podría incluir "psexec..." en el script anterior?
No es necesario incluir psexec en setup.py. Psexec permite iniciar una sesión como "Sistema local" y comprobar si el comportamiento es diferente al instalar y desinstalar software.
Simplemente debe abrir un cmd.exe como administrador con privilegios elevados (puede verificarlo con
quién soy /grupos
que tienes el token de seguridad S-1-16-12288 al final de la lista). Luego escribes
psexec -i -s cmd.exe
y debería aparecer otro símbolo del sistema. En ese símbolo del sistema, puede escribir
¿Quién soy?
para verificar que realmente eres "Sistema local" y luego estás listo para ir y probar que el archivo exe de desinstalación se comporta correctamente en ese contexto.
Salud,
Denis