178 lines
6.8 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 家具导出插件 - 一键安装脚本(PowerShell)
# 目标:
# 1) 复制 bundle 到当前用户:%AppData%\Autodesk\ApplicationPlugins
# 2) 写入 AutoCAD 2024 自启动注册表(避免每次 NETLOAD)
# 3) 追加可信路径 TRUSTEDPATHS(SECURELOAD=1 时必须,否则不自动加载)
$ErrorActionPreference = "Stop"
function Write-Step {
param([string]$Text)
Write-Host $Text -ForegroundColor Cyan
}
function Test-IsAdmin {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object Security.Principal.WindowsPrincipal($identity)
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
function Add-TrustedPath {
param(
[AllowNull()][string]$Existing,
[Parameter(Mandatory = $true)][string]$PathToAdd
)
$normalizedAdd = $PathToAdd.Trim().TrimEnd('\')
$items = @()
if ($Existing) {
$items = $Existing.Split(';') | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne "" }
}
if (-not $items -or $items.Count -eq 0) {
# 保留 AutoCAD 常见默认值,避免误删用户原本设置
$items = @("APP_PATH")
}
$exists = $false
foreach ($it in $items) {
if ($it.Trim().TrimEnd('\').Equals($normalizedAdd, [StringComparison]::OrdinalIgnoreCase)) {
$exists = $true
break
}
}
if (-not $exists) {
$items += $PathToAdd
}
# 去重(忽略大小写 + 末尾反斜杠)
$seen = New-Object "System.Collections.Generic.HashSet[string]" ([StringComparer]::OrdinalIgnoreCase)
$dedup = New-Object System.Collections.Generic.List[string]
foreach ($it in $items) {
$k = $it.Trim().TrimEnd('\')
if ($seen.Add($k)) {
$dedup.Add($it.Trim())
}
}
return ($dedup -join ";")
}
Write-Step "[0/3] 环境检查..."
if (Get-Process acad -ErrorAction SilentlyContinue) {
Write-Host ""
Write-Host "注意:检测到 AutoCAD 正在运行 (acad.exe)。" -ForegroundColor Yellow
Write-Host "为避免 DLL 被占用导致复制/删除失败,建议先完全关闭 AutoCAD 再安装。" -ForegroundColor Yellow
Write-Host ""
}
if (Test-IsAdmin) {
Write-Host ""
Write-Host "注意:你正在以管理员身份运行。" -ForegroundColor Yellow
Write-Host "本插件按“当前 Windows 用户”安装(%AppData% + HKCU 注册表)。" -ForegroundColor Yellow
Write-Host "如果不是在设计师账号下运行,安装后可能在设计师账号下不生效。" -ForegroundColor Yellow
Write-Host ""
}
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$bundleSrc = Join-Path $scriptDir "FurnitureExporter.bundle"
# 兼容“解压覆盖旧目录”导致的套娃结构:FurnitureExporter.bundle\FurnitureExporter.bundle\...
if (-not (Test-Path (Join-Path $bundleSrc "PackageContents.xml"))) {
$nested = Join-Path $bundleSrc "FurnitureExporter.bundle"
if (Test-Path (Join-Path $nested "PackageContents.xml")) {
$bundleSrc = $nested
}
}
if (-not (Test-Path (Join-Path $bundleSrc "PackageContents.xml"))) {
Write-Host "未找到 FurnitureExporter.bundle(请先解压安装包,再运行 安装.bat)。" -ForegroundColor Red
exit 1
}
$appPlugins = Join-Path $env:APPDATA "Autodesk\ApplicationPlugins"
$bundleDst = Join-Path $appPlugins "FurnitureExporter.bundle"
$dllPath = Join-Path $bundleDst "Contents\FurnitureExporter.dll"
$trustedDir = Join-Path $bundleDst "Contents"
Write-Step "[1/3] 复制插件..."
New-Item -ItemType Directory -Path $appPlugins -Force | Out-Null
if (Test-Path $bundleDst) {
try {
Remove-Item -Path $bundleDst -Recurse -Force
}
catch {
Write-Host ""
Write-Host "删除旧版本失败:$bundleDst" -ForegroundColor Red
Write-Host "常见原因:AutoCAD 未完全关闭/文件被占用/安全软件拦截。" -ForegroundColor Yellow
Write-Host "请关闭 AutoCAD 后重试,或手动删除上述目录。" -ForegroundColor Yellow
Write-Host ""
throw
}
}
Copy-Item -Path $bundleSrc -Destination $bundleDst -Recurse -Force
if (-not (Test-Path $dllPath)) {
Write-Host "安装失败:未找到 DLL:$dllPath" -ForegroundColor Red
exit 1
}
Write-Step "[2/3] 注册自启动/可信路径..."
$acadRoot = "HKCU:\Software\Autodesk\AutoCAD\R24.3"
$curVerObj = Get-ItemProperty -Path $acadRoot -Name CurVer -ErrorAction SilentlyContinue
$acadCur = $curVerObj.CurVer
if (-not $acadCur) {
Write-Host "未检测到 AutoCAD 2024 注册表信息:$acadRoot\CurVer" -ForegroundColor Yellow
Write-Host "已完成文件复制,但未写入自启动注册。请确认已至少启动过 AutoCAD 2024 一次。" -ForegroundColor Yellow
}
else {
$acadBase = Join-Path $acadRoot $acadCur
# 1) Applications 自启动(.NET 插件标准方式)
$appKey = Join-Path $acadBase "Applications\FurnitureExporter"
New-Item -Path $appKey -Force | Out-Null
New-ItemProperty -Path $appKey -Name "DESCRIPTION" -PropertyType String -Value "家具导出插件 v$Version" -Force | Out-Null
New-ItemProperty -Path $appKey -Name "LOADCTRLS" -PropertyType DWord -Value 2 -Force | Out-Null
New-ItemProperty -Path $appKey -Name "MANAGED" -PropertyType DWord -Value 1 -Force | Out-Null
New-ItemProperty -Path $appKey -Name "LOADER" -PropertyType String -Value $dllPath -Force | Out-Null
# 2) 可信路径:只加入本插件 Contents,避免把整个 ApplicationPlugins 目录设为可信
$profilesRoot = Join-Path $acadBase "Profiles"
$profiles = Get-ChildItem -Path $profilesRoot -ErrorAction SilentlyContinue
foreach ($p in $profiles) {
$varsKey = Join-Path $p.PSPath "Variables"
if (-not (Test-Path $varsKey)) { continue }
$vars = Get-ItemProperty -Path $varsKey -ErrorAction SilentlyContinue
$existingTrusted = $null
if ($vars.PSObject.Properties.Name -contains "TRUSTEDPATHS") {
$existingTrusted = [string]$vars.TRUSTEDPATHS
}
$newTrusted = Add-TrustedPath -Existing $existingTrusted -PathToAdd $trustedDir
if ($existingTrusted -ne $newTrusted) {
New-ItemProperty -Path $varsKey -Name "TRUSTEDPATHS" -PropertyType String -Value $newTrusted -Force | Out-Null
}
# 如果 SECURELOAD=2,会导致即使加入可信路径也不加载(尽量只从 2 降到 1)
if ($vars.PSObject.Properties.Name -contains "SECURELOAD") {
if ([string]$vars.SECURELOAD -eq "2") {
New-ItemProperty -Path $varsKey -Name "SECURELOAD" -PropertyType String -Value "1" -Force | Out-Null
}
}
}
}
Write-Step "[3/3] 完成"
Write-Host ""
Write-Host "安装完成。请完全关闭 AutoCAD 后重新启动。" -ForegroundColor Green
Write-Host "启动后命令行输入:FEXPORT(单资产)或 FEXPORTPRODUCT(整套兼容)" -ForegroundColor Green
Write-Host ""