Come eseguire un file batch senza avviare una "finestra di comando"? [duplicare]


131

Questa domanda ha già una risposta qui:

Su Windows XP, posso eseguire un file batch (.bat o .cmd), tramite un collegamento, senza una "finestra nera"?


6
Stai chiedendo se riesci a impedire la visualizzazione della finestra di comando quando esegui un file bat?
Eric,

6
Sì, è possibile modificare facilmente il colore predefinito della finestra di output utilizzando il collegamento Proprietà su un cmd.exe. (sì, questo è uno scherzo ...)
Toby J

Risposte:


86

Salvare quanto segue come wscript, ad esempio hidecmd.vbs dopo aver sostituito "testing.bat" con il nome del file batch.

Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs
strArgs = "cmd /c testing.bat"
oShell.Run strArgs, 0, false

Il secondo parametro di oShell.Runè intWindowStylevalore che indica l'aspetto della finestra del programma e il valore zero è per la finestra nascosta.

Il riferimento è qui http://msdn.microsoft.com/en-us/library/d5fk67ky.aspx


La terza riga sarebbe: strArgs = "cmd / c FILEPATH \ testing.bat"?
Dan Z,

1
Un modo per far funzionare la mazza in modalità elevata pur rimanendo invisibile?
Laurens Swart,

Come eseguire il .batfile come administartor usando questo metodo?
Mehdi Dehghani,

44

Questa è solo una semplificazione della risposta di Shaji. È possibile eseguire lo script batch tramite uno script VBScript (.vbs) in questo modo:

'HideBat.vbs
CreateObject("Wscript.Shell").Run "your_batch_file.bat", 0, True

Ciò eseguirà il file batch senza la finestra di comando mostrata.


Come eseguire il .batfile come amministratore usando questo metodo?
Mehdi Dehghani,

Proprietà @MehdiDehghani> sicurezza> esegui come amministratore. Se questo funziona solo per exe o app, allora oh bene.
TaylorS,

21

Solo per espandere le risposte "Usa script di Windows" (che considero migliore perché è già incorporato) ecco come farlo usando un singolo script wrapper e passando il nome del file batch "reale" come parametro. Parametri aggiuntivi verranno passati al file batch.

If WScript.Arguments.Count >= 1 Then
    ReDim arr(WScript.Arguments.Count-1)
    For i = 0 To WScript.Arguments.Count-1
        Arg = WScript.Arguments(i)
        If InStr(Arg, " ") > 0 Then Arg = """" & Arg & """"
      arr(i) = Arg
    Next

    RunCmd = Join(arr)
    CreateObject("Wscript.Shell").Run RunCmd, 0, True
End If

Ad esempio, salva il file sopra come NoShell.vbsda qualche parte quindi chiama:

NoShell.vbs c:\foo\my_batch_file.bat

Infine, se stai cercando di eseguirlo da qualche parte che non comprende il file .vbs (come un "Strumenti esterni" in Visual Studio), ti consigliamo di chiamare C:\Windows\System32\wscript.execon il file vbs come primo parametro e il tuo file batch come il secondo.


6
Per coloro a cui non piace l'idea e il concetto di dover creare un nuovo file vbs per ogni nuovo file bat creato, come si deve usare una delle prime due risposte, questa è la soluzione perfetta. Invece di più file vbs, avrai più scorciatoie. Per ogni nuovo file bat, crea un collegamento al file vbs, fai clic destro su di esso, scegli proprietà> scheda Collegamenti e nella casella Target inserisci il percorso del file bat dopo il percorso che è già lì, proprio come mostrato sopra o come questo se il collegamento non è nello stesso luogo, come il file vbs: "C:\My Files\HideCmd.vbs" c:\foo\my_batch_file.bat.
Rolo,

Se il percorso del file bat ha uno spazio, come può essere chiamato tramite un collegamento al file vbs? Ad esempio: "C:\My Files\HideCmd.vbs" c:\my things\my_batch_file.bat. Non importa cosa provo per il percorso: doppie virgolette attorno a tutto,% 20 al posto dello spazio o una combinazione di quei due, nulla funziona. Ricevo un messaggio di errore che mi dice che il file non può essere trovato o non succede nulla. Ciò è dovuto a un errore dell'utente da parte mia, a una limitazione di Windows con il campo Destinazione per i collegamenti o a un problema con lo script vbs in cui non gestisce correttamente i percorsi dei file con spazi?
Rolo,

@Rolo Ho aggiornato lo script in modo che se uno qualsiasi dei parametri in arrivo ha degli spazi, li circonda tra virgolette. Quindi ti consigliamo di racchiudere il percorso del file batch tra virgolette quando lo chiami, quindi sarà considerato un singolo argomento e riavvolgi prima di essere chiamato.
Toby J,

9

È possibile modificare le proprietà del collegamento per l'esecuzione in modalità ridotta.

Per eseguirlo completamente invisibilmente avrai bisogno di qualcos'altro, come Windows Scripting.


1
Il tuo primo suggerimento è il modo in cui l'ho sempre fatto.
martineau,

8

Utilizzare start con l'opzione '/ B'. Per esempio:

@echo off
start /B go.bat

25
start /beseguirà semplicemente il programma nella console attualmente allocata invece di generarne una nuova. Ne otterrai uno nuovo poiché il batch deve essere eseguito con cmd (che, a sua volta [sorpresa], apre una console).
Joey,

@Joey sì, ma è molto utile per l'avvio di file batch da altre applicazioni tramite l'esecuzione della shell (come SYSTEMin C / C ++).
Tomáš Zato

1
@ TomášZato: puoi semplicemente chiamare il file batch direttamente in quel caso o, se qualunque cosa usi per generare un processo non crea prima una shell, usa cmd /c foo.cmd. Non c'è assolutamente bisogno di usare startin quegli scenari e, direi che systemnon dovrebbe essere usato a favore CreateProcess. Avviando un file batch, sei già dipendente da una piattaforma, potresti anche utilizzare gli strumenti migliori per il lavoro.
Joey,

@Joey Grazie mille, mai sentito cmd /cprima. Il comando cmd è quello di cui avevo bisogno nel mio caso, ma tutte le risposte di stackexchange che ho trovato finora, su un file batch che esegue un altro file batch, hanno le risposte migliori per usare start ...
T_D

start /b go.bat non allocherà una nuova console (cioè un'istanza di conhost.exe - o un thread in csrss.exe prima di Windows 7). Tuttavia creerà un pasticcio poiché lo script batch viene eseguito con una nuova istanza di cmd.exe collegata alla stessa console . Entrambe le istanze della shell competeranno per leggere l'input dalla console, in genere alternato. Ha bisogno /w(ad esempio start /b /w go.bat) per attendere la seconda istanza, che è simile all'utilizzo cmd /cse si utilizza system. Inoltre, se stai chiamando CreateProcess, esegui go.batdirettamente. Non ce n'è bisogno cmd /c.
Eryk Sun,

6

Open source GPL gratuito "Crea processo nascosto"

http://www.commandline.co.uk/chp/

Microsoft Security Essentials e probabilmente la maggior parte degli altri scanner per virus / malware tratteranno l'eseguibile, chp.exe, come un virus perché nasconde qualsiasi programma specificato dalla visualizzazione di una finestra o di un pulsante della barra delle attività, proprio come fanno i virus.

Non è un virus. Ad esempio, non nasconde il processo di destinazione in Gestione attività. E ovviamente il codice sorgente è incluso in modo da poter vedere che è molto piccolo e non fa altro che eseguire qualsiasi programma gli dai.

Non devi nemmeno fidarti che il chp.exe incluso sia stato davvero creato da quella fonte. Puoi andare avanti e scartare il chp.exe incluso e compilare il tuo dal sorgente, e tutti gli strumenti necessari per farlo sono anche gratuiti e scaricabili.


È anche possibile creare un collegamento al file .bat o .cmd, quindi fare clic con il tasto destro del mouse sul collegamento, Proprietà, scheda Collegamento, Esegui: ridotto a icona. Quindi, nelle attività pianificate, utilizzare direttamente il collegamento anziché il file .bat / .cmd. Ciò impedirà la comparsa di una finestra, ma verrà comunque visualizzato un pulsante della barra delle applicazioni.


6

È possibile utilizzare gli script di finestre come AutoIt .

Ad esempio, basta scrivere questo nell'editor di script AutoIt. È abbastanza semplice

Run("C:\test\batchfile.bat", "", @SW_HIDE)

Se vuoi eseguirlo in un ciclo,

$x=0
Do
 Run("C:\test\batchfile.bat", "", @SW_HIDE)
 Sleep(5000)
Until $x = 1

Compilalo come .exe e il gioco è fatto.


Allo stesso modo, in AutoHotkey :

#NoTrayIcon ; To prevent momentary icon pop-up
run whatever.bat arg1 arg2,,hide 

5

Usa Hidden Start (costa $ 20)

Avvio nascosto - Esegui applicazioni e file batch senza una finestra della console o un prompt UAC

Le applicazioni della console e i file batch vengono eseguiti regolarmente all'avvio di Windows o in base a una pianificazione. Il principale inconveniente è che ogni applicazione apre una finestra della console che sfarfalla sullo schermo. Hidden Start (o Hstart) è un'utilità a riga di comando leggera che consente di eseguire applicazioni console e file batch senza alcuna finestra in background, gestire l'elevazione dei privilegi UAC in Windows 7 e Vista, avviare più comandi in parallelo o in modo sincrono e molto altro ancora .

inserisci qui la descrizione dell'immagine


Questa è un'applicazione molto ben progettata e utile.
Guru Josh,

5

Soluzione semplice, senza utilizzare alcun programma aggiuntivo.

  1. Creare il file batch che si desidera eseguire e testarlo.
  2. Crea un collegamento per questo.
  3. Modifica le proprietà del collegamento: nella scheda Collegamento, scegli Esegui minimizzato. Assegna un tasto di scelta rapida e il gioco è fatto!

In bocca al lupo!


7
Questa non è una soluzione al problema del PO. C'è una differenza tra minimizzare e nascondere
nixda,

Se cambi scorciatoia per usare l'icona giusta, lo splash minimizzato sulla barra delle applicazioni è in realtà un bel promemoria che sta iniziando.
Chiunque

Questa è una soluzione bella e pulita per il mio problema! Grazie!
dmitry_romanov,

minimizzare ... hehe.
Gumuruh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.