![AutoHotKey 使用預先輸入的文字執行 cmd,但不執行](https://rvso.com/image/1692528/AutoHotKey%20%E4%BD%BF%E7%94%A8%E9%A0%90%E5%85%88%E8%BC%B8%E5%85%A5%E7%9A%84%E6%96%87%E5%AD%97%E5%9F%B7%E8%A1%8C%20cmd%EF%BC%8C%E4%BD%86%E4%B8%8D%E5%9F%B7%E8%A1%8C.png)
現有問答處理正在運行的命令,但我只是希望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 將會顯示。