现有问答处理正在运行的命令,但我只希望cmd
用预输入的文本打开,因为命令的一部分会随着每次使用而发生变化。
完全虚拟的示例,我想cmd
使用del "py" --arg
预输入的启动 - 是"
故意的(我见过的一些示例存在转义问题)。然后,我会手动添加main
以删除main.py
。
可行吗?寻找除 之外的其他内容Run cmd.exe
,然后“等待”,然后SendInput
,因为cmd
不会立即启动,输入可以转到其他地方。
答案1
我使用了接近您最后一句话的内容(每次启动命令提示符时,它都会输入一些内容),但有两点除外,1)使用 WinWaitActive 确保命令提示符已打开,2)有时循环发送输入并检查 WinActive 以确保它仍然处于活动状态(即,如果另一个窗口窃取焦点则停止发送)。
这并不能避免 100% 的时间将文本发送到其他地方,但大多数情况下确实有效(在您的示例中,如果存在窗口焦点问题,我可能还会将命令分成三个部分,并在每个部分发送时检查 WinActive)。
除了 SendInput 之外的唯一其他选项是通过窗口 ID 将文本发送到窗口,但我在各种程序中使用这种方法都不太成功(看看 ControlSend)。
如果实际上存在一种程序化的方式来实现你所询问的事情,那就太好了(也许其他人会知道)。
发布第 2 部分,以回应最少的编码摘录......
A部分)
此框架可用于仅在窗口首次出现时调用函数。设置参数中的选项“C”。您可以编写自己的精简版本以等待窗口,但此脚本将跟踪哪些窗口已经出现,而不是在焦点转移并返回时重新执行。
将 cmd.exe 放入配置部分可能类似于:
ahk_class ConsoleWindowClass ahk_exe i)cmd.exe C newCmdWindow(`%WA_ID`%)
请注意,脚本在配置部分中使用了上述三组文本(WinTitle、WindowType 和 Function)之间的 [通常不可见] 选项卡
B部分)
newCmdWindow()
函数需要定义...
newCmdWindow(myID)
{
strToSend:="REM :: USE " q("POPD") " TO JUMP BACK HERE..." "{Enter}" "pushd C:\Users\xxxx\Desktop" "{Enter}" ; Init
;------------------------------------------------------
; Minimize collateral damage if window changes
;------------------------------------------------------
Loop, Parse, % strToSend, %A_Space% ; Parse on spaces
{
Sleep, 10 ; give window time to stabilize / make sure windows title isn't changing / minimize colateral damage if window changes
If WinActive("ahk_id" myID)
SendInput % (A_Index > 1) ? A_Space A_LoopField : A_LoopField
}
}
(原始用途:此功能将从任何命令提示符位置跳转到自定义文件夹,因此您可以设置始终打开的“默认”位置,但您也可以使用该命令返回到命令提示符运行的位置。例如,popd
如果您从资源管理器窗口运行 cmd.exe 并特别想在该文件夹中使用命令提示符,它将导航到默认文件夹,但您只需键入即可返回popd
。这与设置始终打开的硬编码默认文件夹不同)
一旦您有了窗口检测框架,只需设置函数来发送您想要发送的内容,它将在第一次激活任何新的命令提示符时发送。
答案2
创建一个热字符串
#IfWinActive Command Prompt ahk_exe cmd.exe
:*:---::del "py" --arg{space}
打开 cmd 提示符,输入---
,您的 cmd 就会显示出来。