Comandi DOS

di DavidE il
25 risposte

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

  • 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

  • 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

  • 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.

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

  • Non insisto…. ;-)

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

    Per caso qui

    Set wsh= CreateObject(“WScript.Shell”)

    hai dimenticato le virgolette?

  • 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… 

  • 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

  • Copia la riga da qui

    Set Dos = CreateObject("WScript.Shell")

    in modo che le virgolette siano corrette

  • 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.

  • Caspita che occhio… 

  • 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.

  • 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