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

NSIS实现全磁盘自动搜索Assetto Corsa指定车辆目录需求

自动搜索Assetto Corsa车辆目录的实现方案

问题分析

你提供的NSIS测试代码存在两个核心问题导致搜索失效:

  1. 驱动器索引转换错误:直接用数字拼接路径会生成0:\这类无效路径,需将数字转为对应的字母(A-Z)
  2. GetVolumeInformation的API调用参数格式错误,无法正确识别有效驱动器

以下提供两种适配你的技术栈(Python+NSIS)的可行方案:


方案一:纯NSIS优化实现

使用FileFunc.nsh的DriveIterator宏枚举有效驱动器,优先检查Steam默认路径,未找到则 fallback 到手动选择:

!include "nsDialogs.nsh"
!include "LogicLib.nsh"
!include "FileFunc.nsh" ; 用于驱动器枚举

Name "Vismonger mod installation"
Outfile "Toyota Supra MKIV Tuned LHD.exe"
InstallDir "C:\Program Files (x86)\Steam\steamapps\common\assettocorsa\content\cars\ks_toyota_supra_mkiv_tuned_lhd"
RequestExecutionLevel admin
XPStyle on

Icon "D:\Downloads\assetto autos\installer\data\upgrade.ico"

Var SOURCE_DIR
Var FOUND_PATH

Page components
Page custom AutoSearchPage
Page directory
Page instfiles

Function AutoSearchPage
    StrCpy $FOUND_PATH ""

    ; 枚举所有固定/可移动磁盘
    ${DriveIterator}::Start "/FIXED /REMOVABLE"
    loop:
        ${DriveIterator}::Next
        Pop $0
        StrCmp $0 "" done_search

        ; 检查Steam默认安装路径
        StrCpy $1 "$0\Program Files (x86)\Steam\steamapps\common\assettocorsa\content\cars\ks_toyota_supra_mkiv_tuned"
        IfFileExists "$1\*.*" found_path continue_search

        continue_search:
        Goto loop

    found_path:
        StrCpy $FOUND_PATH $1
        DetailPrint "自动找到目标目录:$FOUND_PATH"
        Goto done_search

    done_search:
    ${DriveIterator}::Stop

    ; 处理搜索结果
    ${If} $FOUND_PATH != ""
        StrCpy $SOURCE_DIR $FOUND_PATH
    ${Else}
        nsDialogs::SelectFolderDialog "未自动找到目标目录,请手动选择'ks_toyota_supra_mkiv_tuned'文件夹" "C:\Program Files (x86)\Steam\steamapps\common\assettocorsa\content\cars"
        Pop $SOURCE_DIR
        ${If} $SOURCE_DIR == ""
            Abort ; 用户取消选择,终止安装
        ${EndIf}
    ${EndIf}
FunctionEnd

Section "Toyota Supra MKIV Tuned LHD" SEC01
    SetOutPath $INSTDIR
    CopyFiles "$SOURCE_DIR\*.*" $INSTDIR
    File /r "D:\Downloads\assetto autos\installer\data\ks_toyota_supra_mkiv_tuned_lhd\*.*"
SectionEnd

方案二:Python辅助搜索(更灵活可靠)

若NSIS的路径检查逻辑不够灵活(比如需要递归搜索全磁盘),可借助Python实现更强大的搜索功能,再将结果传递给NSIS:

步骤1:编写Python搜索脚本(search_car_folder.py)

import os
import sys

TARGET_FOLDER = "ks_toyota_supra_mkiv_tuned"

def find_target_folder():
    # 优先检查常见路径
    default_paths = [
        r"C:\Program Files (x86)\Steam\steamapps\common\assettocorsa\content\cars",
        r"C:\Program Files\Steam\steamapps\common\assettocorsa\content\cars"
    ]
    for path in default_paths:
        target = os.path.join(path, TARGET_FOLDER)
        if os.path.exists(target) and os.path.isdir(target):
            return target
    
    # 遍历所有固定磁盘递归搜索
    for drive in os.popen('wmic logicaldisk where drivetype=3 get name').read().split():
        if drive.endswith(':'):
            for root, dirs, files in os.walk(drive):
                if TARGET_FOLDER in dirs:
                    return os.path.join(root, TARGET_FOLDER)
    return None

if __name__ == "__main__":
    result = find_target_folder()
    print(result if result else "")
    sys.exit(0)

步骤2:NSIS整合Python脚本

将脚本打包进安装程序,或用PyInstaller打包为独立exe(避免依赖用户Python环境),然后在NSIS中调用:

!include "nsDialogs.nsh"
!include "LogicLib.nsh"

Name "Vismonger mod installation"
Outfile "Toyota Supra MKIV Tuned LHD.exe"
InstallDir "C:\Program Files (x86)\Steam\steamapps\common\assettocorsa\content\cars\ks_toyota_supra_mkiv_tuned_lhd"
RequestExecutionLevel admin
XPStyle on

Icon "D:\Downloads\assetto autos\installer\data\upgrade.ico"

Var SOURCE_DIR
Var SEARCH_TOOL_PATH

Page components
Page custom AutoSearchWithPython
Page directory
Page instfiles

Function AutoSearchWithPython
    InitPluginsDir
    ; 释放搜索工具到临时目录(若用PyInstaller打包则替换为exe路径)
    StrCpy $SEARCH_TOOL_PATH "$PluginsDir\search_car_folder.py"
    File "/oname=$SEARCH_TOOL_PATH" "search_car_folder.py"

    ; 调用工具获取结果
    ExecWait '"python.exe" "$SEARCH_TOOL_PATH"' $0
    Pop $SOURCE_DIR

    ; 未找到则手动选择
    ${If} $SOURCE_DIR == ""
        nsDialogs::SelectFolderDialog "未自动找到目标目录,请手动选择'ks_toyota_supra_mkiv_tuned'文件夹" "C:\Program Files (x86)\Steam\steamapps\common\assettocorsa\content\cars"
        Pop $SOURCE_DIR
        ${If} $SOURCE_DIR == ""
            Abort
        ${EndIf}
    ${EndIf}
FunctionEnd

Section "Toyota Supra MKIV Tuned LHD" SEC01
    SetOutPath $INSTDIR
    CopyFiles "$SOURCE_DIR\*.*" $INSTDIR
    File /r "D:\Downloads\assetto autos\installer\data\ks_toyota_supra_mkiv_tuned_lhd\*.*"
SectionEnd

注意事项

  • 若要避免依赖用户Python环境,用PyInstaller打包脚本:pyinstaller --onefile search_car_folder.py,然后替换NSIS中的调用路径为生成的exe文件
  • 全磁盘递归搜索可能较慢,建议始终优先检查常见路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:28:16