yeg
2026-09-29 e755d14a77af77093d1ada473159010451b457f6
修 22 所取数程序在参数默认值里取脚本目录失败的问题

现场实跑报错:Windows PowerShell 的参数默认值不在脚本作用域里求值,
$PSScriptRoot 在 param 默认值中为空字符串,Join-Path 直接绑定失败、脚本一行都没跑。
改为在正文里解析脚本目录($PSScriptRoot → 命令路径 → 当前目录)后再拼默认路径。

这次是从别的目录实跑一遍验证的(上次只做了语法解析,所以没测出来):
参数正常解析、脚本同目录生成日志、连不上 SQL Server 时按预期报错并退出;
连接超时也确认生效(10 秒 Connect Timeout)。
1个文件已修改
13 ■■■■■ 已修改文件
scripts/j22-collector.ps1 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
scripts/j22-collector.ps1
@@ -50,13 +50,22 @@
    [int]$ConnectTimeoutSec = 10,
    [int]$CommandTimeoutSec = 15,
    [int]$HttpTimeoutSec = 30,
    [string]$StateFile = (Join-Path $PSScriptRoot 'j22-collector-state.json'),
    [string]$LogFile = (Join-Path $PSScriptRoot 'j22-collector.log'),
    # 下面两个留空即在正文里解析成"脚本同目录";不要写成 param 默认值:
    # Windows PowerShell 的参数默认值不在脚本作用域里求值,$PSScriptRoot 在那里是空的(现场实测踩到)。
    [string]$StateFile,
    [string]$LogFile,
    [switch]$Once
)
$ErrorActionPreference = 'Continue'
# 脚本所在目录:$PSScriptRoot 为主,取不到时退回命令路径、再退回当前目录。
$ScriptDirectory = $PSScriptRoot
if ([string]::IsNullOrEmpty($ScriptDirectory)) { $ScriptDirectory = Split-Path -Parent $MyInvocation.MyCommand.Path }
if ([string]::IsNullOrEmpty($ScriptDirectory)) { $ScriptDirectory = (Get-Location).Path }
if ([string]::IsNullOrEmpty($StateFile)) { $StateFile = Join-Path $ScriptDirectory 'j22-collector-state.json' }
if ([string]::IsNullOrEmpty($LogFile)) { $LogFile = Join-Path $ScriptDirectory 'j22-collector.log' }
# ---------------------------------------------------------------- 日志
function Write-Log([string]$message) {
    $line = (Get-Date -Format 'yyyy-MM-dd HH:mm:ss') + ' ' + $message