NSIS实现全磁盘自动搜索Assetto Corsa指定车辆目录需求
自动搜索Assetto Corsa车辆目录的实现方案
问题分析
你提供的NSIS测试代码存在两个核心问题导致搜索失效:
- 驱动器索引转换错误:直接用数字拼接路径会生成
0:\这类无效路径,需将数字转为对应的字母(A-Z) 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
相关产品推荐
相关产品推荐

