Comandi DOS

di il
25 risposte

Comandi DOS

Buongiorno a tutti

sto creando con Access un DB dei comandi DOS. Selezionato il comando da una lista, eseguo la seguente istruzione:

Dim Dos as integer
Dos = Shell("cmd /k " & Prompt, vbNormalFocus)

che funziona correttamente. In questo modo però tutte le volte che lancio un comando si apre una nuova finestra DOS . Invece io vorrei aprire la finestra dei comandi una sola volta e inserire i nuovi comandi a seguito dell'output precedente , come se li eseguissi direttamente dalla finestra. Devo quindi verificare che una finestra non sia già aperta. Se si, invio solo i comandi, se no prima la apro.

Vorrei poi poterla chiudere quando esco. Grazie per l'aiuto, 

Davide

25 Risposte

  • Re: Comandi DOS

    Invece di usare Shell hai pensato di usare questo:

    Set wsh= CreateObject(“WScript.Shell”)
    strCommand="tuo comando DOS"
    wsh.Run strCommand, windowStyle, waitOnReturn

    L'oggetto istanziato in modalità LateBinding è recuperabile se dichiarato Public in modulo o in calce al codice della Classe Form.

    Puoi leggere un po di nozioni qui https://www.vbsedit.com/html/7b956233-c1aa-4b59-b36d-f3e97a9b02f0.asp

  • Re: Comandi DOS

    10/06/2024 - @Alex ha scritto:


    Invece di usare Shell hai pensato di usare questo:

    Set wsh= CreateObject(“WScript.Shell”)
    strCommand="tuo comando DOS"
    wsh.Run strCommand, windowStyle, waitOnReturn

    L'oggetto istanziato in modalità LateBinding è recuperabile se dichiarato Public in modulo o in calce al codice della Classe Form.

    Puoi leggere un po di nozioni qui https://www.vbsedit.com/html/7b956233-c1aa-4b59-b36d-f3e97a9b02f0.asp

    Grazie, ci sto provando ma ottengo questo errore: WScript variabile non definita

  • Re: Comandi DOS

    Ma l'hai dichiarata..? il codice che ti ho passato non è completo… da per scontato tu sappia usare una Libreria.

    Dim wsh As Object
    Dim strCommand As String
    .....

    Ovviamente usando LateBinding anche le Costanti Enum non saranno riconosciute… mi riferisco ai parametri della chiamata a RUN… come il windowStyle ed il waitOnReturn, che dovrai pertanto sostituire con TUE costanti LOCALI, nel LINK che ti avevo indicato trovi tutto.

  • Re: Comandi DOS

    Certo, l'ho dichiarata come object. Ma non mi sembra che il messaggio di errore riguardi quello

  • Re: Comandi DOS

    Non insisto…. ;-)

  • Re: Comandi DOS

    Ma che codice hai scritto alla fine? Ce lo mostri?

    Per caso qui

    Set wsh= CreateObject(“WScript.Shell”)

    hai dimenticato le virgolette?

  • Re: Comandi DOS

    10/06/2024 - oregon ha scritto:


    Ma che codice hai scritto alla fine? Ce lo mostri?

    Per caso qui

    Set wsh= CreateObject(“WScript.Shell”)

    hai dimenticato le virgolette?

    Addirittura una cosa simile… era da copiaincollare… 

  • Re: Comandi DOS

    10/06/2024 - oregon ha scritto:


    Ma che codice hai scritto alla fine? Ce lo mostri?

    Per caso qui

    Set wsh= CreateObject(“WScript.Shell”)

    hai dimenticato le virgolette?

    Questi è il codice che restituisce l'errore

    Dim Prompt As String
    Dim Dos As Object
    
    
    Set Dos = CreateObject(“WScript.Shell”)
    Prompt = cmbCommand.Column(1) & " " & txArg

    la stringa prompt è creata usando una combo dove ho memorizzato i comandi.

    Grazie

  • Re: Comandi DOS

    Puoi fare un PRINT della stringa Prompt…?
    Hai messo quello che si definisce DoubleQuote…? Doppi apici oppure il CHR(34) nei posti giusti .

    Leggi questo:

    https://www.vbforums.com/showthread.php?690335-RESOLVED-Escape-Double-Quotes-Around-Path-in-Shell-Command

  • Re: Comandi DOS

    Copia la riga da qui

    Set Dos = CreateObject("WScript.Shell")

    in modo che le virgolette siano corrette

  • Re: Comandi DOS

    Set Dos = CreateObject("WScript.Shell")

    Questa assegnazione funziona.

    Set Dos = CreateObject(“WScript.Shell”)

    Quest'altra no : WScript variabile non definita !

    Ottimo suggerimento (e vista) Antonio, ciao.

  • Re: Comandi DOS

    Caspita che occhio… 

  • Re: Comandi DOS

    11/06/2024 - oregon ha scritto:


    Copia la riga da qui

    Set Dos = CreateObject("WScript.Shell")

    in modo che le virgolette siano corrette

    Grazie, mi sono accorto ora che le virgolette erano diverse.. in effetti avevo semplicemente copiato e incollato la riga che mi era stata suggerita dove le virgolette non sono quelle solite (maiusc + 2).

    Adesso però, pur avendo settato windowstyle=1 e waitonreturn = true (ho provato anche false) la finestra DOS si chiude immediatamente e non riesco nemmeno a vedere se ha eseguito il comando. Non ho capito che vantaggi questo soluzione possa avere rispetto alla mia.

  • Re: Comandi DOS

    In linea di principio NESSUNO se non per il waitOnReturn che rende SINCRONA la chiamata, quindi se il comando dovesse richiedere 3minuti, l'uscita dalla chiamata avviene dopo 3 minuti, normalmente invece l'uscita è immediata e non sai se viene eseguita.

    Devi però leggere le istruzioni di quello che usi.

    Ad esempio se assegni la call a RUN ad una variabile puoi capire se è stato rilevato un errore o meno…

    errorCode = wsh.Run("myScript.cmd", windowStyle, waitOnReturn)
    If errorCode = 0 Then
        MsgBox "Execution successful. No error to report."
    Else
        MsgBox "Program exited with error code " & errorCode & "."
    End If  

    Quindi usando WScript, intanto sei SINCRONO e poi l'uscita è determinabile… 

    Per farlo con la SHELL avresti dovuto usare le API OpenProcess, metterti in loop ed attendere GetExitCodeProcess.

    Per lasciare aperta la finestra hai provato a passare il parametro 

    /S      Modifies the treatment of string after /C or /K (see below) 
    /C      Carries out the command specified by string and then terminates  
    /K      Carries out the command specified by string but remains 
    wsh.Run "cmd.exe /S /C....
Devi accedere o registrarti per scrivere nel forum
25 risposte