2009-01-29 9 views
2

Ma question est similaire à Running a CMD or BAT in silent mode, mais avec une contrainte supplémentaire.Masquage de la console sans perdre les flux std err/out

Si vous utilisez WshScript.Run dans vbscript, vous perdez l'accès aux flux standard in/error/out du processus. WshScript.Exec vous donne accès aux flux standards, mais vous ne pouvez pas masquer vos fenêtres. Comment pouvez-vous avoir votre gâteau (cacher les fenêtres) et le manger aussi (avoir un accès direct aux flux de la console)?

Je suis actuellement en train de penser à un exécutable C++ qui crée une nouvelle station Windows et un bureau (voir MSDN) et exécute un script spécifié dans ce nouveau bureau (je ne suis pas encore expert sur les stations Windows et les ordinateurs de bureau). cette idée peut être retardée).

Cette idée repose sur la fonctionnalité CondorUSE_VISIBLE_DESKTOP qui, si elle est désactivée, exécute des tâches Condor dans un bureau non visible. Je n'ai pas tout à fait compris si cela nécessite un privilège élevé. Le compromis de cette approche est que votre script peut disparaître dans les limbes s'il bloque sur l'entrée de l'utilisateur.

Quelqu'un a-t-il des idées supplémentaires? Ou des commentaires sur l'approche décrite ci-dessus?

Edit:

En outre, le but de notre script est de configurer l'environnement utilisateur, donc en cours d'exécution d'un autre utilisateur, ou une tâche système prévu est pas vraiment une option (à moins que des intelligents trucs que je ne connais pas).

Répondre

0

Je ne tester un peu cette question, donc ... YMMV

Mettre le code suivant dans un fichier .vbs (j'ai appelé HideWindow.vbs des mines):

Const HIDDEN_WINDOW = 12 

computer = "." 
Set oWmiService = GetObject("winmgmts:" & _ 
          "{impersonationLevel=impersonate}!\\" & _ 
          computer & "\root\cimv2") 
Set oStartup = oWmiService.Get("Win32_ProcessStartup") 

Set oConfig = oStartup.SpawnInstance_ 
oConfig.ShowWindow = HIDDEN_WINDOW 
Set oProcess = GetObject("winmgmts:root\cimv2:Win32_Process") 
ret = oProcess.Create("cmd.exe /c C:\Scripts\test.cmd", null, oConfig, pid) 

appel à partir d'un fichier batch ou d'une ligne de commande comme ceci:

CSCRIPT HideWindow.vbs 

Tout ce que vous mettez dans test.cmd se déroulera sans afficher une fenêtre. Cela pourrait être amélioré de plusieurs façons, mais surtout en paramétrant le programme qui est appelé par oProcess.Create.

1

Je n'ai pas eu de chance avec le fragment VBScript ci-dessus - les fenêtres apparaîtraient toujours. Cependant, j'ai trouvé un outil appelé hstart, qui ressemble à ce dont j'ai besoin. Malheureusement ce n'est pas open source, ou gratuit pour un usage commercial.

1

Cygwin (http://www.cygwin.com/) est livré avec un utilitaire nommé run.exe qui fait ce que vous demandez pour un processus générique. Vous pouvez utiliser ceci pour envelopper votre appel à cscript. Cygwin est GNU si gratuit pour un usage commercial ou personnel.

0

Vous pouvez utiliser Exec, un outil de freeware que j'ai écrit qui fournit une interface de ligne de commande pour l'appel CreateProcess Windows API. La version de l'interface graphique n'a pas de console et vous pouvez l'utiliser pour démarrer un script shell (fichier batch) dans une fenêtre masquée.

Bill