NX 路径自动探测 (换机不用改脚本) - 新增 tools/find-nxbin.ps1, 三级探测: 环境变量 ONEBOT_NXBIN > 项目内 nxbin.txt > C:\Program Files\Siemens\NX*\NXBIN - 多版本共存取版本号最大者 (实测 NX2506+NX2512 共存时正确选 2512), 故 2506 → 2512 换机无需改任何脚本 - _start_all.bat 接入探测, 并优雅降级: 找不到 NX 只警告并跳过 worker, 网页/GenServer 照常启动 (不再因 NX 缺失导致整个启动失败) 修复批处理行尾 (本次改动引入的回归) - 用工具写 .bat 时默认写成 LF, 而 cmd.exe 必须用 CRLF: 裸 LF 会把 `if not defined X (` 拆成乱码, 报 `'ned' 不是内部或外部命令` / `此时不应有 else` - _start_all.bat / _start_web.bat 因此被破坏, 已恢复 CRLF - 新增 tools/fix-lineend.ps1 一键检查/修正 (幂等, 仿 fix-bom.ps1); 该检查额外抓出 2 个同样有问题的文件并一并修正: 一键导出CRA问卷.bat / tools/build-genserver.bat (内容未变, 仅行尾) - 新增 .gitattributes 声明 *.bat/*.cmd eol=crlf, 防止 checkout 后再被转成 LF 验证 - find-nxbin.ps1 实测探测到 C:\Program Files\Siemens\NX2506\NXBIN - 多版本排序逻辑实测选中 2512 - 批处理行尾修复后实际运行通过 - 两个新 ps1 语法自检通过 Co-Authored-By: Claude Code <noreply@anthropic.com>
37 lines
1.9 KiB
PowerShell
37 lines
1.9 KiB
PowerShell
# 把 .bat/.cmd 的行尾统一为 CRLF —— cmd.exe 必须用 CRLF, 裸 LF 会让它误解析。
|
|
# 症状: `if not defined X (` 被拆成 `'ned' 不是内部或外部命令` 之类的乱码报错。
|
|
# 触发场景: 用工具/编辑器写 .bat 时默认写成 LF (本项目踩过)。
|
|
#
|
|
# 幂等: 已是 CRLF 的文件不会被改动。
|
|
# 用法:
|
|
# powershell -NoProfile -ExecutionPolicy Bypass -File tools\fix-lineend.ps1 # 处理项目根 + tools 下全部 .bat/.cmd
|
|
# powershell ... -File tools\fix-lineend.ps1 -Files "a.bat","b.cmd" # 只处理指定文件
|
|
param([string[]]$Files)
|
|
|
|
if (-not $Files) {
|
|
$root = Split-Path $PSScriptRoot -Parent
|
|
$Files = @()
|
|
$Files += Get-ChildItem (Join-Path $root '*.bat') -ErrorAction SilentlyContinue | ForEach-Object { $_.FullName }
|
|
$Files += Get-ChildItem (Join-Path $root '*.cmd') -ErrorAction SilentlyContinue | ForEach-Object { $_.FullName }
|
|
$Files += Get-ChildItem (Join-Path $PSScriptRoot '*.bat') -ErrorAction SilentlyContinue | ForEach-Object { $_.FullName }
|
|
$Files += Get-ChildItem (Join-Path $PSScriptRoot '*.cmd') -ErrorAction SilentlyContinue | ForEach-Object { $_.FullName }
|
|
}
|
|
|
|
foreach ($f in $Files) {
|
|
if (-not (Test-Path $f)) { Write-Output ("跳过(不存在): " + $f); continue }
|
|
$bytes = [System.IO.File]::ReadAllBytes($f)
|
|
# 统一成 CRLF: 先把 CRLF 归一为 LF, 再把 LF 展开为 CRLF
|
|
$text = [System.Text.Encoding]::UTF8.GetString($bytes)
|
|
$text = $text -replace "`r`n", "`n"
|
|
$text = $text -replace "`r", "`n"
|
|
$new = $text -replace "`n", "`r`n"
|
|
if ($new -eq [System.Text.Encoding]::UTF8.GetString($bytes)) {
|
|
Write-Output ("已是 CRLF: " + (Split-Path $f -Leaf))
|
|
} else {
|
|
# 不加 BOM (cmd 对 BOM 敏感, 且 .bat 无需 BOM)
|
|
$enc = New-Object System.Text.UTF8Encoding($false)
|
|
[System.IO.File]::WriteAllText($f, $new, $enc)
|
|
Write-Output ("已修正为 CRLF: " + (Split-Path $f -Leaf))
|
|
}
|
|
}
|