如何将指定批处理语言菜单脚本改写为AutoIt脚本?
批处理转AutoIt:语言选择菜单完整实现
问题解决思路
你需要把那段实现语言选择菜单的批处理脚本转换成AutoIt,目前已经写了部分代码,但遇到了读取INI文件空键的问题。下面我会给你完整的AutoIt实现,完美复刻原批处理逻辑,同时解决空键过滤、有效键识别的问题,最终生成下拉菜单GUI并设置对应变量。
完整AutoIt脚本
#include <GUIConstantsEx.au3> #include <Array.au3> ; 定义语言缩写与名称的映射(和原批处理完全一致) Global $hLangMap = _ArrayCreate( _ "AR", "Arabic", _ "CZ", "Czech", _ "DE", "German", _ "EN", "English", _ "ES", "Spanish", _ "ESMX", "Spanish(Mexico)", _ "FR", "French", _ "HU", "Hungarian", _ "IT", "Italian", _ "JP", "Japanese", _ "KR", "Korean", _ "PL", "Polish", _ "PR", "Portuguese", _ "PRBR", "Portuguese(Brazil)", _ "RU", "Russian", _ "ZH", "Chinese" _ ) Global $aAvailableLangs = [] ; 存储可用语言的[缩写, 名称]对 Global $LangOpt = "" ; 选中的语言缩写 Global $LangIs = "" ; 最终语言标识 Global $step = 1 ; 对应原批处理的step变量,可根据你的上下文调整 ; 第一步:遍历Data1到Data99.ini,收集可用语言 For $D = 1 To 99 $sIniPath = @ScriptDir & "\Common\Settings\Data" & $D & ".ini" If FileExists($sIniPath) Then ; 读取INI所有段(和原批处理逻辑一致,不局限于某一个段) $aIniSections = IniReadSectionNames($sIniPath) If Not @error Then For $i = 1 To $aIniSections[0] $aSectionKeys = IniReadSection($sIniPath, $aIniSections[$i]) If Not @error Then For $j = 1 To $aSectionKeys[0][0] $sKey = $aSectionKeys[$j][0] $sValue = $aSectionKeys[$j][1] ; 过滤空键,只处理以"Include"开头且值不为空的有效键 If StringLen($sKey) > 7 And StringLeft($sKey, 7) = "Include" And StringLen($sValue) > 0 Then $sLangCode = StringRight($sKey, StringLen($sKey) - 7) ; 提取AR/EN这类缩写 ; 检查该语言是否在映射表中,且未被重复添加 $nMapIndex = _ArraySearch($hLangMap, $sLangCode, 0, 0, 0, 1) If $nMapIndex <> -1 And _ArraySearch($aAvailableLangs, $sLangCode, 0, 0, 0, 1) = -1 Then _ArrayAdd($aAvailableLangs, $sLangCode) _ArrayAdd($aAvailableLangs, $hLangMap[$nMapIndex + 1]) EndIf EndIf Next EndIf Next EndIf EndIf Next ; 如果没有可用语言,直接退出(对应原批处理OptNum=0的逻辑) If UBound($aAvailableLangs) = 0 Then Exit EndIf ; 第二步:创建语言选择下拉菜单GUI Global $hGUI = GUICreate("STEP " & $step & ": Language Selection", 350, 120) GUISetFont(10) ; 构建下拉菜单的选项文本数组 Global $aDropdownOptions = [] For $k = 1 To UBound($aAvailableLangs) Step 2 _ArrayAdd($aDropdownOptions, $aAvailableLangs[$k]) Next Global $hDropdown = GUICtrlCreateCombo("Choose Which Language to Compress", 20, 20, 310, 25) For $m = 0 To UBound($aDropdownOptions) - 1 GUICtrlAddString($hDropdown, $aDropdownOptions[$m]) Next Global $hOKBtn = GUICtrlCreateButton("OK", 130, 60, 90, 30) GUISetState(@SW_SHOW) ; 第三步:处理GUI事件,获取用户选择 While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $hOKBtn $sSelectedName = GUICtrlRead($hDropdown) ; 匹配选中名称对应的语言缩写 $nOptIndex = _ArraySearch($aDropdownOptions, $sSelectedName, 0, 0, 0, 1) If $nOptIndex <> -1 Then $LangOpt = $aAvailableLangs[$nOptIndex * 2] $LangIs = $LangOpt ; 可选:添加日志记录(对应原批处理的日志输出) ; FileWrite($workdir & "\Conversion.log", @HOUR & ":" & @MIN & ":" & @SEC & " - Selected Language: " & $sSelectedName & @CRLF) ExitLoop EndIf EndSwitch WEnd GUIClose($hGUI) ; 后续逻辑可直接使用$LangOpt和$LangIs变量 ConsoleWrite("Selected Language Code: " & $LangOpt & @CRLF) ConsoleWrite("LangIs set to: " & $LangIs & @CRLF)
关键细节说明
- 空键过滤与有效键识别:
- 遍历INI所有段和键,只保留以
Include开头、键值不为空的条目 - 通过字符串截取提取语言缩写,确保只处理映射表中存在的语言
- 遍历INI所有段和键,只保留以
- 语言去重处理:
- 使用数组查询避免重复添加同一语言,和原批处理的
ShowXX=1逻辑等价
- 使用数组查询避免重复添加同一语言,和原批处理的
- GUI交互优化:
- 下拉菜单只显示可用语言,避免无效选项
- 点击OK按钮自动匹配选中名称对应的缩写,设置目标变量
- 兼容原批处理逻辑:
- 保留了遍历Data1到Data99.ini的触发逻辑
- 完全复用原批处理的语言映射表,确保功能一致性
内容的提问来源于stack exchange,提问作者VollachR
相关产品推荐
相关产品推荐

