You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定批处理语言菜单脚本改写为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)

关键细节说明

  1. 空键过滤与有效键识别:
    • 遍历INI所有段和键,只保留以Include开头、键值不为空的条目
    • 通过字符串截取提取语言缩写,确保只处理映射表中存在的语言
  2. 语言去重处理:
    • 使用数组查询避免重复添加同一语言,和原批处理的ShowXX=1逻辑等价
  3. GUI交互优化:
    • 下拉菜单只显示可用语言,避免无效选项
    • 点击OK按钮自动匹配选中名称对应的缩写,设置目标变量
  4. 兼容原批处理逻辑:
    • 保留了遍历Data1到Data99.ini的触发逻辑
    • 完全复用原批处理的语言映射表,确保功能一致性

内容的提问来源于stack exchange,提问作者VollachR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:08:30