Тема: AHK: CMD StdOut проблемы с кодировкой параметров
Общий привет.
Нужно как-то создавать папку (и другие операции), сейчас это не работает, русская кодировка теряется. В общем нужно как-то передавать параметры в правильной кодировке. Вот тестовый код:
s := "__тест_test"
MsgBox, % StdOut("cmd.exe /u /q /c mkdir ""C:\temp\" . s . """ ", "cp866") ; not work
MsgBox, % StdOut("cmd.exe /a /q /c mkdir ""C:\temp\" . s . """ ", "cp866") ; not work
StdOut(sCmd, encoding)
{
static STARTF_USESTDHANDLES := 0x100, CREATE_NO_WINDOW := 0x08000000
DllCall("CreatePipe", PtrP, hStdInRd, PtrP, hStdInWr, UInt, 0, UInt, 0)
DllCall("CreatePipe", PtrP, hStdOutRd, PtrP, hStdOutWr, UInt, 0, UInt, 0)
DllCall("SetHandleInformation", Ptr, hStdInRd, UInt, 1, UInt, 1)
DllCall("SetHandleInformation", Ptr, hStdOutWr, UInt, 1, UInt, 1)
VarSetCapacity(pi, A_PtrSize*2 + 8, 0)
NumPut( VarSetCapacity( si, A_PtrSize*4 + 4*8 + A_PtrSize*5, 0), si )
NumPut(STARTF_USESTDHANDLES, si, A_PtrSize*4 + 4*7)
NumPut(hStdInRd , si, A_PtrSize*4 + 4*8 + A_PtrSize*2)
NumPut(hStdOutWr , si, A_PtrSize*4 + 4*8 + A_PtrSize*3)
NumPut(hStdOutWr , si, A_PtrSize*4 + 4*8 + A_PtrSize*4)
DllCall("CreateProcess", UInt, 0, Ptr, &sCmd, UInt, 0, UInt, 0, Int, True, UInt, CREATE_NO_WINDOW, UInt, 0, UInt, 0, Ptr, &si, Ptr, &pi)
for k, v in [NumGet(pi, 0), NumGet(pi, A_PtrSize), hStdOutWr, hStdInRd, hStdInWr]
DllCall("CloseHandle", Ptr, v)
VarSetCapacity(sTemp, 4095)
while DllCall("ReadFile", UInt, hStdOutRd, Ptr, &sTemp, UInt, 4095, UIntP, nSize, UInt, 0)
sOutput .= StrGet(&sTemp, nSize, encoding)
DllCall("CloseHandle", Ptr, hStdOutRd)
Return sOutput
}
Дополнительно сообщаю, что использую системы windows 7-10 x64, autohotkey x64 unicode 1.1.30.00, сами файлы скриптов в кодировке utf-8. Скритов таких много и все работало хорошо, пока не стали использовать русские буквы в названиях файлов\каталогов, поэтому, жеталательно, простое, ясное и однозначное решение вопроса, чтобы там все не переделывать.