Что нового

Проблемы с кодировкой

HoloPaladin

Новичок
Сообщения
5
Репутация
0
есть скрипт подключения к БД и выполнения операций с ней через командную строку. В данный момент он имеет вид:

Код:
$cmp_win = Run(@ScriptDir&'\Server\FirebirdServer\isql.exe "'&$server&':'&$Database&'" -user sysdba -password masterkey')
WinWaitActive(@ScriptDir&'\Server\FirebirdServer\isql.exe')
sleep(2000)
send('UPDATE OR INSERT INTO "Settings" ("Key", "Value")' & "{ENTER}")
send("VALUES ('"&$s_key&"','"&$s_data&"');" & "{ENTER}")
send("commit;" & "{ENTER}")


Проблемное место очевидно - если isql затупил при старте, сенд шлет клавиши в тупящее окно.

Я ищу способ либо заставить скрипт как-то "ждать" выполнения предыдущей команды или придумать костыль.

Один костыль был придуман: просто писать все в батник и запускать его, тогда ведь все пойдет как один бат-файл, последовательно. Однако что бы я не писал во флаги FileOpen() батник создается в UTF-8 и командная строка его не хочет прожевывать с кириллическими символами в путях. А они там почти всегда есть.

Например вот так делаю батник и он все равно в UTF-8:

Код:
_FileCreate ( @ScriptDir&'\'&$batfilename)
FileOpen($batfilename,512)
FileWriteLine($batfilename,'"'&@ScriptDir&'\Server\FirebirdServer\isql.exe'&'"'&' "'&$server&':'&$Database&'" -user sysdba -password masterkey')
FileWriteLine($batfilename,'UPDATE OR INSERT INTO "Settings" ("Key", "Value")')
FileWriteLine($batfilename,"VALUES ('"&$s_key&"','"&$s_data&"');")
FileWriteLine($batfilename,"commit;")
FileClose($batfilename)
$cmp_win = RunWait($batfilename)


Добавление FileWriteLine($batfilename,'chcp 65001 >null')первой строкой записи в файл - почему-то проблему не решает, все равно кирилица не проходит в командную строку.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Re: Последовательное выполнение команд в cmd

https://autoit-script.ru/index.php?topic=9307.0
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Re: Последовательное выполнение команд в cmd

Alofa сказал(а):

У топик-стартера судя по пути запуска FireBird.
Функции SQLite работают с FireBird? Я просто не пробовал, а в описании не нашел.
https://autoit-script.ru/index.php?topic=16470.0
 
Автор
H

HoloPaladin

Новичок
Сообщения
5
Репутация
0
Re: Последовательное выполнение команд в cmd

hedji сказал(а):
Извините, вам запрещено оставлять внешние ссылки.
_Encoding_ANSIToOEM пробовал.

Код:
#include <File.au3>
#include <Encoding.au3>
$batfilename = Random(100000000000,900000000000)&'.bat'
_FileCreate ( @ScriptDir&'\'&$batfilename)
FileOpen($batfilename)
FileWriteLine($batfilename,_Encoding_ANSIToOEM('пиу-пиу'))
FileClose($batfilename)
$cmp_win = RunWait($batfilename)

выводит кашу вместо пиу-пиу
 

СН3СН2ОН

Знающий
Сообщения
78
Репутация
12
Re: Последовательное выполнение команд в cmd

Код:
FileOpen($batfilename,2 + 16)
$batCode = '"'&@ScriptDir&'\Server\FirebirdServer\isql.exe'&'"'&' "'&$server&':'&$Database&'" -user sysdba -password masterkey' & _
	  'UPDATE OR INSERT INTO "Settings" ("Key", "Value")' & _
	  'UPDATE OR INSERT INTO "Settings" ("Key", "Value")' & _
	  'commit;'
FileWrite($batfilename, _Encoding_ANSIToOEM($batCode))

FileClose($batfilename)
$cmp_win = RunWait($batfilename)
 
A

Alofa

Гость
Re: Последовательное выполнение команд в cmd

hedji сказал(а):
... Функции SQLite работают с FireBird?..

Сам не пробовал, он что такое FireBird?
Firebird (FirebirdSQL) — кроссплатформенная система управления базами данных.
Если у Autoit есть UDF SQLite.au3, а у автора БД SQL, то зачем ему Firebird?
Этот так, чисто предположение :smile:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Re: Последовательное выполнение команд в cmd

HoloPaladin
SciTE должен работать в режиме ANSI (меню "File - Encoding - Code Page Property")
Код:
$batfilename = "test.bat"
$server = "server"
$Database = "database"
$s_key = "ключ"
$s_data = "данные"
$Text = '"' & @ScriptDir & '\Server\FirebirdServer\isql.exe' & '"' & ' "' & $server & ':' & $Database & '" -user sysdba -password masterkey' & @CRLF & _
        'UPDATE OR INSERT INTO "Settings" ("Key", "Value")' & @CRLF & _
        "VALUES ('" & $s_key & "','" & $s_data & "');" & @CRLF & _
        "commit;"
$aRet = DllCall("user32.dll", "bool", "CharToOem", "str", $Text, "str", $Text)
$File = FileOpen($batfilename, 2 + 512)
FileWrite($File, $aRet[2])
FileClose($File)
;~ $cmp_win = RunWait($batfilename)
 
Автор
H

HoloPaladin

Новичок
Сообщения
5
Репутация
0
Re: Последовательное выполнение команд в cmd

Не с того конца я в итоге решил корову доить.

Решение найдено в результате обсуждений с друзьями, вместо батника или веселья с командной строкой буду просто генерить скрипт и скармливать его isql.
 
Автор
H

HoloPaladin

Новичок
Сообщения
5
Репутация
0

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Re: Последовательное выполнение команд в cmd

HoloPaladin
у isql ведь не будет проблем с UTF-8?
Я не знаком с isql. Вы просили перевести батник в кодировку OEM. Вам предложили решения. Затем вы решили вместо одного файла сделать другой. Вот мне и стало интересно - зачем? Если дело в кодировке, то понятно.
 
Автор
H

HoloPaladin

Новичок
Сообщения
5
Репутация
0
Re: Последовательное выполнение команд в cmd

в итоге проблема не решилась, все равно у меня каша вместо кириллицы.
Переделал вот этот вариант:
InnI сказал(а):
HoloPaladin
SciTE должен работать в режиме ANSI (меню "File - Encoding - Code Page Property")
Код:
$batfilename = "test.bat"
$server = "server"
$Database = "database"
$s_key = "ключ"
$s_data = "данные"
$Text = '"' & @ScriptDir & '\Server\FirebirdServer\isql.exe' & '"' & ' "' & $server & ':' & $Database & '" -user sysdba -password masterkey' & @CRLF & _
        'UPDATE OR INSERT INTO "Settings" ("Key", "Value")' & @CRLF & _
        "VALUES ('" & $s_key & "','" & $s_data & "');" & @CRLF & _
        "commit;"
$aRet = DllCall("user32.dll", "bool", "CharToOem", "str", $Text, "str", $Text)
$File = FileOpen($batfilename, 2 + 512)
FileWrite($File, $aRet[2])
FileClose($File)
;~ $cmp_win = RunWait($batfilename)
В:
Код:
func change_record_scr($s_key,$s_data)
	$sqlfilename = Random(100000000000,900000000000)&'.sql'
	_FileCreate ( @ScriptDir&'\'&$sqlfilename)
$Text = 'UPDATE OR INSERT INTO "Settings" ("Key", "Value")' & @CRLF & _
        "VALUES ('" & $s_key & "','" & $s_data & "');" & @CRLF & _
        "commit;"
$aRet = DllCall("user32.dll", "bool", "CharToOem", "str", $Text, "str", $Text)
$File = FileOpen($sqlfilename, 2 + 512)
FileWrite($File, $aRet[2])
$cmp_win = RunWait(@ScriptDir&'\Server\FirebirdServer\isql.exe "'&$server&':'&$Database&'" -user sysdba -password masterkey -i "'&$sqlfilename&'"')
EndFunc

результат - работает, пока во вносимых данных нет кирилицы. А они там есть.
Пробовал менять режим ANSI обратно, пробовал убирать 512 из FileOpen, пробовал не конвертить текст через user32.dll. Вроде во всех вариантах пробовал. Всегда каша, хоть и разная.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
HoloPaladin

Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
HoloPaladin
1. В справке по функции FileOpen указано: "При открытии несуществующего файла для записи, он создаётся." Это я к тому, что нет необходимости предварительно создавать файл функцией _FileCreate. Но это ваше личное дело.
2. После записи в файл вы его не закрыли функцией FileClose. Подобное поведение не гарантирует наличие в файле всех данных, т.к. FileWrite пишет в буфер (см. примечание в справке к функции FileFlush).
3. Непонятно, где у вас "каша" - в файле или в базе? Если в файле, то нужно знать, как (а точнее, в какой кодировке) вы передаёте параметры в функцию. Если в базе... тут я не смогу помочь.
4. Раньше вы делали bat-файл, для этого переводили кодировку в OEM. Сейчас вы создаёте sql-файл. Вы уверены, что в нём кодировка может быть OEM?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
2017 год, а у некоторых до сих пор ANSI и OEM
 
A

Alofa

Гость
Альтернатива:
Код:
$sIsql = FileGetShortName(@ScriptDir & '\Server\FirebirdServer\isql.exe')
Run(@ComSpec & ' /c ' & $sIsql & ' "' & $server & ':' & $Database & '" -user sysdba -password masterkey&&' & _
		'UPDATE OR INSERT INTO "Settings" ("Key", "Value")&&' & _
		"VALUES ('" & $s_key & "','" & $s_data & "');&&" & _
		'commit;')

(проверить не могу)
 
Верх