- Offizieller Beitrag
In der Shoutbox gab es ja heute die Diskussion über die "Script breaking changes" und das dadurch einige ältere Scripte nicht mehr laufen.
Ich denke, bei den meisten alten Scripten müssen nur ein paar Ersetzungen vorgenommen werden. Beim durchschauen von meinen alten Scripten sind mir drei wesentliche Punkte aufgefallen:
1. die globale GDI+ Variable (alt: $ghGDIPDll, neu: $__g_hGDIPDll).
2. die Funktion "_IIF", die aufgrund des ternären Operators gestrichen wurde.
3. AdlibEnable -> AdlibRegister und AdlibDisable -> AdlibUnRegister.
Und warum alles von Hand ersetzen, wenn wir doch AutoIt haben? Also habe ich ein kleines Script geschrieben, was diese Ersetzungen vornimmt:
#include <FileConstants.au3>
Global $sOldAutoItScript = FileOpenDialog('Bitte das alte Script auswählen!', @ScriptDir, 'AutoIt-Script (*.au3)', $FD_FILEMUSTEXIST + $FD_PATHMUSTEXIST)
If @error Then Exit
Global $sOldScript = FileRead($sOldAutoItScript)
_ReplaceGDIPVar($sOldScript)
_ReplaceIIF($sOldScript)
_ReplaceAdlib($sOldScript)
_ReplaceStringReverse($sOldScript)
_ReplaceOnAutoItExit($sOldScript)
_ReplaceOnAutoItStart($sOldScript)
Global $sPath = StringRegExpReplace($sOldAutoItScript, '(.+\\).+', '$1')
Global $sNewFile = StringRegExpReplace($sOldAutoItScript, '.+\\(.+)\.au3', '$1_new.au3')
Global $hFile = FileOpen($sPath & $sNewFile, 2)
FileWrite($hFile, $sOldScript)
FileClose($hFile)
ShellExecute($sPath & $sNewFile)
; Die globale Variable bei GDI+ wurde geaendert.
; Das laesst sich durch einfaches Replace beheben
Func _ReplaceGDIPVar(ByRef $sScript)
$sScript = StringReplace($sScript, '$ghGDIPDll', '$__g_hGDIPDll')
EndFunc ;==>_ReplaceGDIPVar
; Die Funktion "_IIF()" wurde geloescht zugunsten des ternaeren Operators.
; Das laesst sich auch austauschen
Func _ReplaceIIF(ByRef $sScript)
$sScript = StringRegExpReplace($sScript, '(?s)(.*)_IIF\((.+?),(.+?),(.+?)\)(.*)', '$1($2 ?$3 :$4)$5')
EndFunc ;==>_ReplaceIIF
; AdlibEnable wurde gegen AdlibRegister ausgetauscht
; und AdlibDisable gegen AdlibUnRegister.
; Das laesst sich durch einfaches Replace beheben
Func _ReplaceAdlib(ByRef $sScript)
$sScript = StringReplace($sScript, 'AdlibEnable', 'AdlibRegister')
$sScript = StringReplace($sScript, 'AdlibDisable', 'AdlibUnRegister')
EndFunc ;==>_ReplaceAdlib
; Die Funktion "_StringReverse" wurde durch eine interne Funktion "StringReverse" ersetzt.
; Das laesst sich durch einfaches Replace beheben
Func _ReplaceStringReverse(ByRef $sScript)
$sScript = StringReplace($sScript, '_StringReverse', 'StringReverse')
EndFunc ;==>_ReplaceStringReverse
; Die Funktion "OnAutoItExit()" und die Option "Opt('OnExitFunc', 'Funktion')" wurden
; durch "OnAutoItExitRegister()" ersetzt.
; Damit die Funktionalitaet des alten Scripts erhalten bleibt, muss die Funktion dort registriert werden.
Func _ReplaceOnAutoItExit(ByRef $sScript)
If StringInStr($sScript, 'Func OnAutoItExit') Then
$sScript = StringFormat('OnAutoItExitRegister("OnAutoItExit")\r\n%s', $sScript)
EndIf
If StringRegExp($sScript, '(?s).*(?:AutoItSetOption|Opt)\(.OnExitFunc.+') Then
Local $sFunc = StringRegExpReplace($sScript, '(?s).*(?:AutoItSetOption|Opt)\(.OnExitFunc.,.*?(\w+).+?\).*', '$1')
$sScript = StringFormat('OnAutoItExitRegister("%s")\r\n%s', $sFunc, $sScript)
$sScript = StringRegExpReplace($sScript, '(?s)(.*)(?:AutoItSetOption|Opt)\(.OnExitFunc.,.+?\)(.*)', '$1$2')
EndIf
EndFunc ;==>_ReplaceOnAutoItExit
; Die Funktion "OnAutoItStart()" wurde durch eine Preprozessor-Anweisung "#OnAutoItStartRegister" ersetzt.
; Damit die Funktionalitaet des alten Scripts erhalten bleibt, muss die Funktion dort eingetragen werden.
Func _ReplaceOnAutoItStart(ByRef $sScript)
If StringInStr($sScript, 'Func OnAutoItStart') Then
$sScript = StringFormat('#OnAutoItStartRegister "OnAutoItStart"\r\n%s', $sScript)
EndIf
EndFunc ;==>_ReplaceOnAutoItStart
Alles anzeigen
Fallen euch noch weitere "Script breaking changes" ein, die man hier mit aufnehmen kann?
Edit 30.01.18: Es gibt jetzt noch folgende Ersetzungen:
- _StringReverse
- OnAutoItExit
- OnAutoItStart
Außerdem habe ich mal ein Beispielscript im alten Stil ("test1.au3" im Anhang) geschrieben, was mit der aktuellen AutoIt-Version nicht lauffähig ist. So könnt ihr sehen, was das obige Script daraus macht und dass es danach funktioniert.