2017-06-18 2 views
1

J'ai un lot Windows qui fait des choses. (Assez long, tâches VM, avec QEMU et Lua). Je souhaite diriger toute la sortie stdout provenant des commandes d'écho et d'appel du batch (stdout) vers une section définie de la fenêtre d'affichage de Windows Consule, pour dessiner une barre de titre grisée en haut et en bas de la fenêtre pendant la sortie affiche ce que fait le script. Un peu comme une zone de texte, qui s'enroulera automatiquement et défilera comme le fait la fenêtre CMD, dans une section définie de la fenêtre (exemple rétro, le DOAD wad loader, qui place des barres de titre rouges en haut et en bas lors de l'initialisation, mais ici je l'aimerais avec le choix de couleur moins ennuyeux).Définir une zone de sortie stdout définie pour la sortie par lots Windows?

Je me demande si cela peut être fait, raisonnablement, dans un lot ou dans un wrapper exécutable auquel le fichier batch peut être redirigé, où il enverra sa sortie standard?


EDIT: Update 1

Suggestion: PowerShell?

L'incorporation de PowerShell pour accomplir la configuration de la fenêtre de la console est très bien, mais gardez à l'esprit que la plupart des gens justes ont défini les permissions d'exécution PowerShell sur Restreint. La signification de l'ajout automatique de l'élévation VBScript et d'un ajusteur d'autorisation PowerShell/auto-unblocker/Restricted permission restore ajouterait du volume inutile et une invite UAC ennuyante à mon script. Cette suggestion comporte également le risque de déclencher un AV intelligent dans un faux positif sur les fonctionnalités d'expansion polyglotte d'un tel script.

Suggestion: ANSI Caractères d'échappement

Très bon délicat pour le lot efficace, je dirais. Je suis conscient du gris inversé, qui afficherait les barres de titre de manière adiquante. Maintenant, la réponse a été pointée dans la bonne direction. Existe-t-il des séquences d'échappement ANSI pour ajuster le tampon de sortie? Cette suggestion n'est pas explicitement verrouillée à Windows 10 si vous modifiez la page de codes de la fenêtre Consule.

+0

S'il vous plaît lire attentivement ==> [Comment puis-je poser une bonne question?] (Http://stackoverflow.com/help/how-to-ask) ==> [Comment créer un fichier minimal, Exemple complet et vérifiable] (http://stackoverflow.com/help/mcve) ==> [Quels types de questions devrais-je éviter de poser?] (Http://stackoverflow.com/help/dont-ask) ===> [Quels sont les sujets que je peux poser ici?] (Http://stackoverflow.com/help/on-topic) – Hackoo

+0

Ce genre de chose est extrêmement ennuyeux à faire en batch. C'est techniquement possible, mais je recommande fortement de ne pas le faire. – SomethingDark

+0

Considérant que ce script particulier s'exécute pendant une longue période de temps et doit afficher l'état graphique de l'utilisateur, j'ai pensé qu'il était possible de le faire. Il s'agit d'un lot de script VM de contrôle à distance. Je voudrais que l'utilisateur ait quelque chose à regarder, en particulier lors d'une opération telle que la défragmentation et la mise à zéro de l'espace libre, pour préparer le redimensionnement. Nous ne parlons pas d'effets arc-en-ciel, juste une simple barre supérieure/inférieure grise annonçant sa présence étendue. –

Répondre

1

Petit échantillon avec des séquences d'échappement ansi.
Il divise l'écran en deux zones séparées, les 10 premières lignes sont fixées sans défilement, la région ci-dessous utilise le défilement.

@echo off 
call :cls 
call :setWindowSize 50 120 
call :setWindowPos 1040 0 
call :splitWindow 11 
call :gotoxy 1 1 
for /L %%n in (1 1 5) do (
    echo Job: %%n 
) 
call :gotoxy 1 20 
for /L %%n in (1 1 50) do (
    echo Cnt: %%n 
) 
exit /b 

:setWindowSize 
set "lines=%1 
set "columns=%2" 
call :echo-e "\e[8;%lines%;%columns%t"; 

:gotoxy 
set "y=%1" 
set "x=%2" 
call :echo-e "\e[%x%;%y%H" 
exit /b 

:cls 
call :echo-e "\e[2J" 
exit /b 

:setWindowPos 
set "x=%1" 
set "y=%2" 
call :echo-e "\e[3;%x%;%y%t"; 
exit /b 

:splitWindow 
set /a "pos=%1 - 1" 
call :echo-e "\ec\e[2J\e[%1;80r\e[%pos%H\e[46m\e[K\e[0m" 
exit /b 

:windowToFront 
call :echo-e "\e[2t""\e[1t" 
exit /b 

:echo-e 
set "arg1=%~1" 
setlocal EnableDelayedExpansion 
set "arg1=!arg1:\x=0x!" 
set "arg1=!arg1:\e=0x1B!" 
forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c <nul set /p 0x22=!arg1!0x22" 
exit /b 
+0

Merci! C'est exactement ce dont j'avais besoin pour nettoyer la sortie de mon script. –