ver ventana uso sintaxis silencioso ejemplo ejecutar comandos comando bat windows powershell batch-file

windows - ventana - sintaxis de comandos cmd



¿Cómo puedo obtener la ventana activa actual en el momento en que se ejecuta una secuencia de comandos por lotes? (2)

Para cualquiera que busque una solución que no sea de Powershell, aquí hay una secuencia de comandos por lotes que usa cscript para invocar un bloque de JScript. El JScript crea un nuevo proceso hijo, obtiene su PID, luego recorre la línea de ancestros ParentProcessID hasta que llega a explorer.exe y luego devuelve el PID del hijo directo. Debería devolver el PID correcto para la ventana de la consola en la que se ejecuta la secuencia de comandos, incluso si se ejecutan varias instancias de cmd.exe o cscript.exe .

¿Qué puedo decir? Me sentía creativo hoy.

@if (@a==@b) @end /* JScript multiline comment :: begin batch portion @echo off setlocal for /f "delims=" %%I in (''cscript /nologo /e:Jscript "%~f0"'') do ( echo PID of this console window is %%I ) goto :EOF :: end batch portion / begin JScript */ var oShell = WSH.CreateObject(''wscript.shell''), johnConnor = oShell.Exec(''%comspec% /k @echo;''); // returns PID of the direct child of explorer.exe function getTopPID(PID, child) { var proc = GetObject("winmgmts:Win32_Process=" + PID); // uncomment the following line to watch the script walk up the ancestor tree // WSH.Echo(proc.name + '' has a PID of '' + PID); return (proc.name == ''explorer.exe'') ? child : getTopPID(proc.ParentProcessID, PID); } var PID = getTopPID(johnConnor.ProcessID); johnConnor.Terminate(); // send the console window to the back for a second, then refocus, just to show off oShell.SendKeys(''%{ESC}''); WSH.Sleep(1000); oShell.AppActivate(PID); // output PID of console window WSH.Echo(PID);

Tengo un script por lotes que quiero ejecutar con teclas rápidas, y este script se supone que debe realizar algunas acciones en la ventana activa (por ejemplo, crear un conjunto particular de carpetas o minúsculas con todos los nombres de los archivos dentro de la carpeta). Por lo tanto, la secuencia de comandos debe hacer referencia a la ventana activa cuando se la llama.

He intentado dejar el campo "Comenzar en" del alias vacío, pero al hacer eco de% cd% siempre imprimo "C: / Windows / System32" en lugar de la ventana activa actual.


Puede buscar qué proceso obtuvo la ventana en primer plano usando pinvoke de user32.dll. He usado este truco para el método system.window.forms.sendkeys en un script:

Add-Type @" using System; using System.Runtime.InteropServices; public class Tricks { [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow(); } "@ $a = [tricks]::GetForegroundWindow() get-process | ? { $_.mainwindowhandle -eq $a } # in my case: Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 161 7 13984 15820 91 9,75 7720 Console