1 (изменено: OmTatSat, 2018-04-30 11:30:08)

Тема: AHK: Патчить все файлы в папке по расширению при нажатии хоткея.

Здравствуйте, помогите пожалуйста разобраться, почему не присваивается переменная FilePath = %A_LoopField%. msgbox нормально показывает путь с %A_LoopField%

FileList =
Loop, Files, *.dng
   FileList = %FileList%%A_LoopFileLongPath%`n
Loop, Parse, FileList, `n

MsgBox %A_LoopField%
FilePath = %A_LoopField% ; Путь к файлу.
;MsgBox, % FilePath
;FilePath = D:\Downloads_after_15.08.17\фотки\Новая папка\IMG_20180427_081748 - origcopy - Копия.dng
Offset = 0x34a      ; Смещение в файле, по которому писать.

Data =               ; Данные для записи. Пробелы необязательны.
(
10 27 00 00 10 27 00 00 00 00 00 00 10 27 00 00
00 00 00 00 10 27 00 00 00 00 00 00 10 27 00 00
10 27 00 00 10 27 00 00 00 00 00 00 10 27 00 00
00 00 00 00 10 27 00 00 00 00 00 00 10 27 00 00
10 27 00 00 10 27 00 00 10 27 00 00 10 27 00 00
00 00 00 00 10 27 00 00 00 00 00 00 10 27 00 00
00 00 00 00 10 27 00 00 10 27 00 00 10 27 00 00
00 00 00 00 10 27 00 00 00 00 00 00 10 27 00 00
00 00 00 00 10 27 00 00 10 27
)

Result := FilePatch(FilePath, Offset, Data)

MsgBox, Записано байтов: %Result%


; ===================== Функция записи в файл. ======================

FilePatch(SrcFile, Offset, HexString) 
{
  If not FileExist(SrcFile) {
    MsgBox, 16, %A_ThisFunc%, Не найден файл:`n%SrcFile%
    Return 0
  }

  FileGetSize, FileSize, %SrcFile%

  If(Offset >= FileSize) {
    MsgBox, 16, %A_ThisFunc%, Смещение за пределами файла.
    Return 0
  }

  If RegExMatch(HexString, "i)0x") {
    MsgBox, 16, %A_ThisFunc%,
    (LTrim
      Неверный формат данных: префикс "0x".
      Функция не предназначена для записи чисел,
      только последовательностей байтов.
    )
    Return 0
  }

  HexString := RegExReplace(HexString, "\s")

  If HexString is not xDigit
  {
    MsgBox, 16, %A_ThisFunc%,
    (LTrim
      Строка данных содержит недопустимые символы.
      Допустимы только 0123456789ABCDEF.
    )
    Return 0
  }

  Len := StrLen(HexString)

  If Mod(Len, 2)
  {
    MsgBox, 16, %A_ThisFunc%,
    (LTrim
      В строке данных нечётное количество символов.
      Каждый байт нужно обозначать двумя цифрами.
    )
    Return 0
  }

  cBytes := Len / 2

  VarSetCapacity(Buf, cBytes, 0)

  Pos = 1

  Loop, % cBytes
  {
    Byte := "0x" . SubStr(HexString, Pos, 2)
    Pos += 2
    NumPut(Byte, Buf, A_Index - 1, "Char")
  }

  OPEN_EXISTING = 3
  FILE_WRITE_DATA = 2
  FILE_BEGIN = 0

  VarSetCapacity(BytesWritten, 4, 0)

  hFile := DllCall( "CreateFile", "Str",  SrcFile
                                , "UInt", FILE_WRITE_DATA
                                , "UInt", 0
                                , "UInt", 0
                                , "UInt", OPEN_EXISTING
                                , "UInt", 0
                                , "UInt", 0 )

  If(hFile = -1) {
    MsgBox, 16, %A_ThisFunc%, Не удалось открыть файл.
    Return 0
  }

  DllCall( "SetFilePointer", "UInt",  hFile
                           , "UInt", Offset
                           , "UInt", 0
                           , "UInt", FILE_BEGIN )

  If(A_LastError) {
    DllCall( "CloseHandle", "UInt", hFile )
    MsgBox, 16, %A_ThisFunc%
              , Ошибка при установке указателя файла: %A_LastError%
    Return 0
  }

  Ret := DllCall( "WriteFile", "UInt", hFile
                             , "UInt", &Buf
                             , "UInt", cBytes
                             , "UInt", &BytesWritten
                             , "UInt", 0 )

  If(Ret = 0) {
    DllCall( "CloseHandle", "UInt", hFile )
    MsgBox, 16, %A_ThisFunc%, Не удалось записать в файл.
    Return 0
  }

  DllCall( "CloseHandle", "UInt", hFile )

  Return NumGet(BytesWritten, 0, "UInt")
}

2 (изменено: OmTatSat, 2018-04-30 11:30:41)

Re: AHK: Патчить все файлы в папке по расширению при нажатии хоткея.

Разобрался, скобок {} после "Loop, Parse, FileList, `n" не хватало.

3 (изменено: OmTatSat, 2019-06-21 18:34:41)

Re: AHK: Патчить все файлы в папке по расширению при нажатии хоткея.

В итоге.
Патчер не мой, оригинал патчера. http://forum.script-coding.com/viewtopic.php?id=3207

Но прикрутил к нему умение патчить все файлы в папке по расширению при нажатии f6.

Сделан под файл менеджер Xplorer2, кто хочет может переделать под explorer.

#if MouseIsOver("ahk_class ATL:ExplorerFrame") 
f6::
{
FileList =
WinGetTitle, Title, ahk_class ATL:ExplorerFrame
;var := RegExMatch(title, "\-(.*)", match)
var := RegExMatch(title, "(.*) - xplorer2", match)
var := match1
		path := var "\"
Loop, Files, %path%*.dng
   FileList = %FileList%%A_LoopFileLongPath%`n
Loop, Parse, FileList, `n
{
;MsgBox %FileList%%A_LoopFileLongPath%`n
ToolTip
FilePath = %A_LoopField% ; Путь к файлу.
If (FilePath != "") 
{
;MsgBox, % FilePath
;FilePath = D:\Downloads_after_15.08.17\фотки\IMG_20180427_081748 - origcopy - Копия.dng
Offset = 0x34a      ; Смещение в файле, по которому писать.

Data =               ; Данные для записи. Пробелы необязательны.
(
10 27 00 00 10 27 00 00 00 00 00 00 10 27 00 00
00 00 00 00 10 27 00 00 00 00 00 00 10 27 00 00
10 27 00 00 10 27 00 00 00 00 00 00 10 27 00 00
00 00 00 00 10 27 00 00 00 00 00 00 10 27 00 00
10 27 00 00 10 27 00 00 10 27 00 00 10 27 00 00
00 00 00 00 10 27 00 00 00 00 00 00 10 27 00 00
00 00 00 00 10 27 00 00 10 27 00 00 10 27 00 00
00 00 00 00 10 27 00 00 00 00 00 00 10 27 00 00
00 00 00 00 10 27 00 00 10 27
)

Result := FilePatch(FilePath, Offset, Data)

tooltip, Записано байтов: %Result%


; ===================== Функция записи в файл. ======================

FilePatch(SrcFile, Offset, HexString) 
{
  If not FileExist(SrcFile) {
    MsgBox, 16, %A_ThisFunc%, Не найден файл:`n%SrcFile%
    Return 0
  }

  FileGetSize, FileSize, %SrcFile%

  If(Offset >= FileSize) {
    MsgBox, 16, %A_ThisFunc%, Смещение за пределами файла.
    Return 0
  }

  If RegExMatch(HexString, "i)0x") {
    MsgBox, 16, %A_ThisFunc%,
    (LTrim
      Неверный формат данных: префикс "0x".
      Функция не предназначена для записи чисел,
      только последовательностей байтов.
    )
    Return 0
  }

  HexString := RegExReplace(HexString, "\s")

  If HexString is not xDigit
  {
    MsgBox, 16, %A_ThisFunc%,
    (LTrim
      Строка данных содержит недопустимые символы.
      Допустимы только 0123456789ABCDEF.
    )
    Return 0
  }

  Len := StrLen(HexString)

  If Mod(Len, 2)
  {
    MsgBox, 16, %A_ThisFunc%,
    (LTrim
      В строке данных нечётное количество символов.
      Каждый байт нужно обозначать двумя цифрами.
    )
    Return 0
  }

  cBytes := Len / 2

  VarSetCapacity(Buf, cBytes, 0)

  Pos = 1

  Loop, % cBytes
  {
    Byte := "0x" . SubStr(HexString, Pos, 2)
    Pos += 2
    NumPut(Byte, Buf, A_Index - 1, "Char")
  }

  OPEN_EXISTING = 3
  FILE_WRITE_DATA = 2
  FILE_BEGIN = 0

  VarSetCapacity(BytesWritten, 4, 0)

  hFile := DllCall( "CreateFile", "Str",  SrcFile
                                , "UInt", FILE_WRITE_DATA
                                , "UInt", 0
                                , "UInt", 0
                                , "UInt", OPEN_EXISTING
                                , "UInt", 0
                                , "UInt", 0 )

  If(hFile = -1) {
    MsgBox, 16, %A_ThisFunc%, Не удалось открыть файл.
    Return 0
  }

  DllCall( "SetFilePointer", "UInt",  hFile
                           , "UInt", Offset
                           , "UInt", 0
                           , "UInt", FILE_BEGIN )

  If(A_LastError) {
    DllCall( "CloseHandle", "UInt", hFile )
    MsgBox, 16, %A_ThisFunc%
              , Ошибка при установке указателя файла: %A_LastError%
    Return 0
  }

  Ret := DllCall( "WriteFile", "UInt", hFile
                             , "UInt", &Buf
                             , "UInt", cBytes
                             , "UInt", &BytesWritten
                             , "UInt", 0 )

  If(Ret = 0) {
    DllCall( "CloseHandle", "UInt", hFile )
    MsgBox, 16, %A_ThisFunc%, Не удалось записать в файл.
    Return 0
  }

  DllCall( "CloseHandle", "UInt", hFile )

  Return NumGet(BytesWritten, 0, "UInt")
}
}
}
}


MouseIsOver(WinTitle) {
MouseGetPos, , , Win
return WinExist(WinTitle . " ahk_id " . Win)
	
   }