Как прочитать вывод команды в Git Bash через Autohotkey - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь отправить команду на терминал Git Bash через Autohotkey, но не могу найти способ прочитать ее вывод. Есть ли простой способ для этого? Я посылаю это

Выполнить, C: \ Users \ Неизвестно \ AppData \ Local \ Programs \ Git \ git-bash.exe
сон, 2000

Отправить cd / c / Пользователи / Неизвестно / Рабочий стол / git / fw {Enter}

сон, 1000

Send git log --pretty = format: '`% h' -n 1 {Enter}

Ответом является номер коммита, отображаемый на терминале

Как я могу это прочитать?

Спасибо

1 Ответ

0 голосов
/ 13 ноября 2018

Захватывающий выход

Чтобы захватить вывод команды, вы можете использовать одну из следующих RunWaitOne() функций.

Вариант 1: Не использует временный файл и не может скрыть окно команд. ( Источник )

; From https://www.autohotkey.com/docs/commands/Run.htm#Examples
RunWaitOne(command) {
  shell := ComObjCreate("WScript.Shell")
  exec := shell.Exec(ComSpec " /C """ command """") ; change: added '"' around command
  return exec.StdOut.ReadAll()
}

Вариант 2: Используется временный файл, и окно команд скрыто. (Выпущено под WTFPL )

RunWaitOne(command) {
  tmpFile := A_Temp . "\" . A_ScriptName . "_RunWaitOne.tmp"
  RunWait, % ComSpec . " /c """ . command . " > """ . tmpFile . """""",, Hide
  FileRead, result, %tmpFile%
  FileDelete, %tmpFile%
  return result
}

Рабочий пример

Мне лично не нравится жесткое кодирование в путях, поэтому следующий ответ настроен для выполнения следующих шагов:

  1. Найдите установку Git в системной переменной окружения PATH и сохраните ее как GIT_BIN_DIR
  2. Если установка еще не найдена, найдите ее в каталогах установки по умолчанию и сохраните ее как GIT_BIN_DIR
  3. Показать сообщение об ошибке, если Git не может быть найден и завершен.
  4. Поставить в очередь команды для вызова.
  5. Выполнить команды и сохранить результат в переменной result.
  6. Показать результат

Код

Код выпускается под WTFPL

; STEP 1: Try to find Git on PATH
EnvGet, E_PATH, PATH
GIT_BIN_DIR := ""
for i, path in StrSplit(E_PATH, ";")
{
  if (RegExMatch(path, "i)Git\\cmd$")) {
    SplitPath, path, , parent
    GIT_BIN_DIR := parent . "\bin"
    break
  }
}

; STEP 2: Fallback to default install directories.
if (GIT_BIN_DIR == "") {
  allUsersPath := A_ProgramFiles . "\Git\bin"
  currentUserPath := A_AppData . "\Programs\Git\bin"
  if (InStr(FileExist(currentUserPath), "D"))
    GIT_BIN_DIR := currentUserPath
  else if (InStr(FileExist(allUsersPath), "D"))
    GIT_BIN_DIR := allUsersPath
}

; STEP 3: Show error Git couldn't be found.
if (GIT_BIN_DIR == "") {
  MsgBox 0x1010,, Could not find Git's 'bin' directory
  ExitApp
}

; STEP 4 - Queue any commands.
; commands becomes "line1 & line2 & ..." thanks to the Join continuation section
commands := "
(Join`s&`s
cd /c/Users/Unknown/Desktop/git/fw
git log --pretty=format:'`%h' -n 1
)"

; STEP 5 - Execute the commands (Uses "Git\bin\sh.exe" so we can capture output)
result := RunWaitOne("""" . GIT_BIN_DIR . "\sh.exe"" --login -i -c """ . commands . """")

; STEP 6 - Show the result
MsgBox 0x1040,, % result
...