1

Тема: AHK: помощник в работе с командной строкой (в Total Commander'е)

Помощь этого скрипта в том, что он показывает командную строку с которой его запустили. На мой взгляд очень полезный инструмент. Вот, допустим, сделали вы для запуска приложения кнопочку в Total Commander'е, и в кнопочке же прописали какие-нить Тоталовские параметры (ну, там %M %O и т.д.). Вроде все правильно написали, а ожидаемых действий не получается. Тут вы берете, и вместо запускаемого приложения прописываете предлагаемый скрипт. И когда нажмете на созданную кнопочку, то скрипт покажет полученные параметры. И становится видно что не так: а-а, кавычки забыл поставить, или символ процента не экранировал, или... да мало ли в чем можно ошибиться. Понятное дело, область применения Тоталом не ограничивается. Собственно, на написание скрипта меня сподвигла одна прожка, которая в качестве стороннего инструмента вызывала другую прожку, передавая ей некие параметры. А эта другая прожка не запускается и всё тут. Бился я, бился. Да и накатал скрипт. Смотрю: а в передаваемых первой прожкой параметрах, лишний бэкслэш. Во-о-от оно в чем дело, подумал я, да и написал автору прожки (тот и поправил этот дурацкий баг).
Если при использовании в каком-нить приложении столкнетесь с тем, что скрипт не запускается (немало прог, желающих запускать только exe'шники, и не желающих - скрипты), то можно либо откомпилировать скрипт в exe'шник, либо прописать так: "D:\Program_2\AutoHotkey\AutoHotkey.exe" "D:\Program_2\AutoHotkey\HScripts\GetCommandLine(-ScriptInfo).ahk" (пути, разумеется, указать свои). А дальше уже вписывать всякие нужные вам параметры.
На самом деле, скрипта два. Первый - не содержит командную строку, выполняемую операционной системой для запуска самого скрипта (примерно такую, что я написал выше). Второй скрипт показывает всю командную строку полностью. Его можно использовать в познавательных целях .
Можно было сделать проще (без GUI и настроек пользователя), но зачем же проще, если можно лучше.

Основной скрипт:

;*******************************************************************************
; AutoHotkey Version:   1.0.44.09+
; Автор:                Androgen Belkin
; Имя скрипта:          GetCommandLine(-ScriptInfo).ahk (v.1.0)
;*******************************************************************************
; Получение командной строки для текущего процесса.
; (НЕ содержит информацию и о ком. строке самого скрипта).
;*******************************************************************************
#NoTrayIcon           ; не отображать иконку скрипта в трее
#NoEnv                ; запрещаем имена переменных как у переменных окружения
#SingleInstance force ; перезагрузить скрипт, если он уже запущен

; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ===============
ExpandEnvVars = 1 ; разворачивать ли встреченные в ком. строке переменные окружения или показывать как есть (1 - разворачивать)
; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ==========

Command_Line := DllCall( "GetCommandLine", str ) ; получить командную строку для текущего процесса

; строка ниже - удаляет инфу самого скрипта, и показывает оставшиеся параметры
StringMid, Command_Line, Command_Line, InStr( Command_Line, A_ScriptFullPath ) + StrLen( A_ScriptFullPath ) + 2
    , StrLen( Command_Line ) ; отрезать начало командной строки (путь к AutoHotkey.exe+имя скрипта+кавычка+пробел)

If ExpandEnvVars = 1 ; если указано разворачивать переменные окружения, то...
    Command_Line := ExpandEnvVars( Command_Line ) ; вызываем функцию по разворачиванию переменных окружения
    
IF Not Command_Line
    Text_Caption = Командная строка пуста!
Else
    Text_Caption = Получена следующая командная строка:

Gui, +LastFound ; делаем окно GUI последним найденным
Gui, Add, Text, Center, %Text_Caption% ; добавляем заголовок строки (со свойством текста "по центру")
Gui, Add, Edit, ReadOnly vMyEdit, %Command_Line% ; добавляем поле редактирования (только для чтения)
Gui, Add, Button, Default w75 h23 gMyButton, &OK ; добавляем кнопку "ОК" с заданными размерами
Gui, Show, Hide ; создаем окно в скрытом виде
WinGetPos,,, Gui_Width ; получить ширину окна
GuiControl, Move, Static1, % "w" Gui_Width - 24 ; поместить заголовок строки по центру ширины
GuiControl, Move, Edit1, % "w" Gui_Width - 24 ; поместить поле с командной строкой по центру ширины
GuiControl, Move, Button1, % "x" Gui_Width/2 - 75/2 - 3 ; поместить кнопку "ОК" по центру ширины
Gui, Show ; показываем окно
Return ; закончить секцию автовыполнения

GuiClose: ; при нажатии кнопки закрытия окна
GuiEscape: ; при нажатии кнопки ESC
MyButton: ; при нажатии кнопки "ОК"
ExitApp ; закончить скрипт
Return ; закончить обработку горячей клавиши

ExpandEnvVars( ppath ) ; функция по разворачиванию переменных окружения в их содержание
{
    VarSetCapacity( Dest, 2000 ) ; обеспечиваем достаточную вместимость переменной
    DllCall( "ExpandEnvironmentStrings", Str, ppath, Str, Dest, Int, 1998 ) ; получаем содержание п. окруж-я
    Return, Dest ; возвращаем содержание переменной окружения
}

Дополнительный (познавательный) скрипт:

;*******************************************************************************
; AutoHotkey Version:   1.0.44.09+
; Автор:                Androgen Belkin
; Имя скрипта:          GetCommandLineFull.ahk (v.1.0)
;*******************************************************************************
; Получение командной строки для текущего процесса.
; (Содержит информацию и о ком. строке самого скрипта).
;*******************************************************************************
#NoTrayIcon           ; не отображать иконку скрипта в трее
#NoEnv                ; запрещаем имена переменных как у переменных окружения
#SingleInstance force ; перезагрузить скрипт, если он уже запущен

; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ===============
ExpandEnvVars = 1 ; разворачивать ли встреченные в ком. строке переменные окружения или показывать как есть (1 - разворачивать)
; ========== КОНЕЦ НАСТРОЕК ПОЛЬЗОВАТЕЛЯ ==========

Command_Line := DllCall( "GetCommandLine", str ) ; получить командную строку для текущего процесса

If ExpandEnvVars = 1 ; если указано разворачивать переменные окружения, то...
    Command_Line := ExpandEnvVars( Command_Line ) ; вызываем функцию по разворачиванию переменных окружения

Gui, +LastFound ; делаем окно GUI последним найденным
Gui, Add, Text, Center, Получена следующая командная строка: ; добавляем заголовок строки (со свойством текста "по центру")
Gui, Add, Edit, ReadOnly vMyEdit, %Command_Line% ; добавляем поле редактирования (только для чтения)
Gui, Add, Button, Default w75 h23 gMyButton, &OK ; добавляем кнопку "ОК" с заданными размерами
Gui, Show, Hide ; создаем окно в скрытом виде
WinGetPos,,, Gui_Width ; получить ширину окна
GuiControl, Move, Static1, % "w" Gui_Width - 24 ; поместить заголовок строки по центру ширины
GuiControl, Move, Edit1, % "w" Gui_Width - 24 ; поместить поле с командной строкой по центру ширины
GuiControl, Move, Button1, % "x" Gui_Width/2 - 75/2 - 3 ; поместить кнопку "ОК" по центру ширины
Gui, Show ; показываем окно
Return ; закончить секцию автовыполнения

GuiClose: ; при нажатии кнопки закрытия окна
GuiEscape: ; при нажатии кнопки ESC
MyButton: ; при нажатии кнопки "ОК"
ExitApp ; закончить скрипт
Return ; закончить обработку горячей клавиши

ExpandEnvVars( ppath ) ; функция по разворачиванию переменных окружения в их содержание
{
    VarSetCapacity( Dest, 2000 ) ; обеспечиваем достаточную вместимость переменной
    DllCall( "ExpandEnvironmentStrings", Str, ppath, Str, Dest, Int, 1998 ) ; получаем содержание п. окруж-я
    Return, Dest ; возвращаем содержание переменной окружения
}

Забрать оба скрипта в одном архивчике:

Post's attachments

GetCommandLine.zip 2.77 kb, 666 downloads since 2006-08-27 

You don't have the permssions to download the attachments of this post.
Крокодил, крокожу и буду крокодить! (Твёрдое обещание нетрезвого кодера).