Pagina 1 di 2

[RISOLTO] La sintassi per il nome del file... è errata

Pubblicato: 25 settembre 2018 - 15:38
di empbilly
Ciao,

Ho creato un pacchetto per installare il software Surfer 11. In questo pacchetto ho anche programmato l'opzione per disinstallare le vecchie versioni prima di installare quella nuova.

Dopo l'esecuzione sul client, l'output del comando mostra l'errore seguente:

Codice: Seleziona tutto

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.
Pacchetto:

Codice: Seleziona tutto

# -*- 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 sintassi per il nome del file... è errata

Pubblicato: 25 settembre 2018 - 15:46
di htouvet
Ciao,
Sembra che uninstall_cmd restituisca un elenco non suddiviso correttamente.
Il comando run può avere come primo argomento una lista o una stringa str. Nel caso di una lista, il primo elemento della lista deve essere l'eseguibile e gli elementi successivi sono gli argomenti del comando.
Quindi se ottieni [u'"C:\\ProgramData\\{5F3A4BBA-1519-45F2-9BF7-1E9924E32CAA}\\Surfer(11.1.719)_Installer.exe" REMOVE=TRUE MODIFY=FALSE'] come valore di ritorno di uninstall_cmd (ovvero un elenco con un solo membro), un modo per aggirare il problema è prendere il primo argomento come cmd

Codice: Seleziona tutto

# -*- 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 sintassi per il nome del file... è errata

Pubblicato: 25 settembre 2018 - 17:05
di empbilly
Ciao htouvet, grazie per la risposta!!!

Ho apportato la modifica, ma si è verificato un errore di timeout.

Ho eseguito un test sulla mano con il comando seguente e l'ho rimossa silenziosamente.

Codice: Seleziona tutto

C:\ProgramData\{5F3A4BBA-1519-45F2-9BF7-1E9924E32CAA}>"Surfer(11.1.719)_Installer.exe" REMOVE=TRUE SILENT=TRUE MODIFY=FALSE
Come posso passare questa opzione SILENT=TRUE come argomento?

Re: La sintassi per il nome del file... è errata

Pubblicato: 25 settembre 2018 - 17:18
di htouvet
basta aggiungerlo al comando...

Codice: Seleziona tutto

# -*- 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 sintassi per il nome del file... è errata

Pubblicato: 25 settembre 2018 - 17:51
di empbilly
Freddo!!

Ma se eseguo manualmente tramite cmd il comando:

Codice: Seleziona tutto

C:\ProgramData\{5F3A4BBA-1519-45F2-9BF7-1E9924E32CAA}>"Surfer(11.1.719)_Installer.exe" REMOVE=TRUE MODIFY=FALSE SILENT=TRUE
viene rimosso molto velocemente.

Tramite script, si verifica l'errore di timeout. Imposto un timeout di 180 secondi, a scopo di test.

Codice: Seleziona tutto

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 ''''
C'è qualcosa che non va nel mio script?

Re: La sintassi per il nome del file... è errata

Pubblicato: 26 settembre 2018 - 13:05
di dcardon
Ciao Elias,
empbilly ha scritto: 25 settembre 2018 - 17:51 Ma se eseguo manualmente tramite cmd il comando:

Codice: Seleziona tutto

C:\ProgramData\{5F3A4BBA-1519-45F2-9BF7-1E9924E32CAA}>"Surfer(11.1.719)_Installer.exe" REMOVE=TRUE MODIFY=FALSE SILENT=TRUE
viene rimosso molto velocemente.

Tramite script, si verifica l'errore di timeout. Imposto un timeout di 180 secondi, a scopo di test.

Codice: Seleziona tutto

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 ''''
C'è qualcosa che non va nel mio script?
Si verifica questo comportamento quando si esegue lo script in PyScripter o tramite WAPTService? Se funziona tramite PyScripter, potrebbe essere un problema nell'esecuzione di questo comando nel contesto "Sistema locale" (WaptService viene eseguito come "Sistema locale").

Saluti,

Denis

Re: La sintassi per il nome del file... è errata

Pubblicato: 26 settembre 2018 - 14:17
di empbilly
Si verifica questo comportamento quando si esegue lo script in PyScripter o tramite WAPTService? Se funziona tramite PyScripter, potrebbe essere un problema nell'esecuzione di questo comando nel contesto "Sistema locale" (WaptService viene eseguito come "Sistema locale").
Sto utilizzando WAPTService.

C'è un modo per risolvere questo problema?

Re: La sintassi per il nome del file... è errata

Pubblicato: 26 settembre 2018 - 15:16
di dcardon
Ciao Empbilly,
empbilly ha scritto: 26 settembre 2018 - 14:17
Si verifica questo comportamento quando si esegue lo script in PyScripter o tramite WAPTService? Se funziona tramite PyScripter, potrebbe essere un problema nell'esecuzione di questo comando nel contesto "Sistema locale" (WaptService viene eseguito come "Sistema locale").
Sto utilizzando WAPTService.

C'è un modo per risolvere questo problema?
Dovresti provare a eseguire il binario di disinstallazione nel contesto "sistema locale". Per farlo, puoi installare tis-ms-pstools ed eseguire

Codice: Seleziona tutto

psexec -i -s cmd.exe
per ottenere una shell come "sistema locale". È possibile utilizzare

Codice: Seleziona tutto

whoami
per verificare se stai davvero eseguendo il comando SYSTEM. Quindi esegui il file binario di disinstallazione.
Se funziona, puoi provare ad avviare pyscripter come "sistema locale" e verificare se l'installazione del pacchetto avviene nello stesso modo del tuo contesto utente.

Saluti,

Denis

Re: La sintassi per il nome del file... è errata

Pubblicato: 26 settembre 2018 - 18:53
di empbilly
dcardon,

come posso includere "psexec..." nello script qui sopra?

Re: La sintassi per il nome del file... è errata

Pubblicato: 26 settembre 2018 - 19:44
di dcardon
Ciao Elias,
empbilly ha scritto: 26 settembre 2018 - 18:53 dcardon,

Come posso includere "psexec..." nello script qui sopra?
Non è necessario includere psexec in setup.py. Psexec consente di avviare una sessione come "Sistema locale" e verificare se il comportamento è diverso durante l'installazione e la disinstallazione del software.
Dovresti semplicemente aprire un cmd.exe come amministratore con privilegi elevati (puoi controllare con
whoami /gruppi
che hai il token di sicurezza S-1-16-12288 alla fine dell'elenco). Quindi digiti
psexec -i -s cmd.exe
e dovresti ottenere un altro prompt dei comandi. In quel prompt dei comandi puoi digitare
Ciao
per verificare che tu sia realmente un "Sistema locale" e poi sei pronto per testare che il file exe di disinstallazione si comporti correttamente in quel contesto.

Saluti,

Denis