Существующие вопросы и ответыобрабатывать запущенные команды, но я просто хочу открыть cmd
с предварительно набранным текстом, поскольку часть команды меняется при каждом использовании.
Полностью фиктивный пример, я бы хотел запустить cmd
с del "py" --arg
предустановленным - это "
сделано намеренно (проблемы экранирования в некоторых примерах, которые я видел). Затем я бы вручную добавил main
удалить main.py
.
Это выполнимо? Ищете что-то другое, чем Run cmd.exe
, затем «подождите», затем SendInput
, так как cmd
не запускается мгновенно, и ввод может быть направлен в другое место.
решение1
Я использую что-то близкое к вашему последнему предложению (каждый раз, когда запускается командная строка, она что-то вводит), за исключением двух моментов: 1) использование WinWaitActive для проверки того, открыта ли командная строка, и 2) иногда отправка ввода в цикле с проверкой WinActive, чтобы убедиться, что она все еще активна (т. е. остановка отправки, если другое окно перехватывает фокус).
Это не исключает отправку текста в другое место в 100% случаев, но в большинстве случаев работает (в вашем примере я мог бы также разделить команду на три части и отправлять каждую с проверкой WinActive между ними, если возникли проблемы с фокусом окна).
Единственным другим вариантом, помимо SendInput, является отправка текста в окно по идентификатору окна, что не всегда удавалось мне в различных программах (см. ControlSend).
Но если бы действительно существовал программный способ сделать то, о чем вы спрашиваете, это было бы здорово (возможно, кто-то другой знает).
Опубликуйте Часть 2, в ответ на минимальный фрагмент кода...
Часть А)
Этот фреймворк можно использовать для вызова функции только в первый раз, когда появляется окно. Опция «C» в параметрах настройки. Вы можете написать собственную урезанную версию, чтобы просто ждать окна, но этот скрипт будет отслеживать, какие окна уже появились, а не выполняться повторно, если фокус смещается и возвращается обратно.
Помещение cmd.exe в раздел конфигурации может выглядеть примерно так:
ahk_class ConsoleWindowClass ahk_exe i)cmd.exe C newCmdWindow(`%WA_ID`%)
Обратите внимание, что скрипт использует [обычно невидимые] вкладки в разделе конфигурации между тремя наборами текста, показанными выше: WinTitle, WindowType и Function.
Часть Б)
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}
Откройте командную строку, введите ---
, и ваша командная строка отобразится.