PowerShell脚本块内变量无法传递至外部函数的问题
问题分析与修复
你的核心问题是远程会话与本地会话的变量作用域完全隔离,远程脚本块里的$script:sdate属于远程机器的脚本作用域,本地会话根本访问不到,所以传给writeToServer的是无效值。
修复步骤
- 让
Invoke-Command直接返回远程机器的计算机名和时间,本地接收返回结果 - 移除远程脚本块里的无效变量赋值,改用返回值传递数据
- 确保
writeToServer接收的是远程返回的有效数据
修正后的代码
# Function to manipulate the data Function writeToServer { param($server, $Time) # Data preparation for loading data into SQL table $InsertResults = @" INSERT INTO [ServerTimeSync].[dbo].[ServerTimes](SystemName,ShownTimeOnServer) VALUES ('$server','$Time') "@ # Call the invoke-sqlcmdlet to execute the query Invoke-sqlcmd @params -Query $InsertResults } foreach ($COMPUTER in $COMPUTERS){ # 远程执行并返回结果:计算机名和格式化后的时间 $remoteData = Invoke-Command -ComputerName $COMPUTER -ScriptBlock { [PSCustomObject]@{ ComputerName = $ENV:COMPUTERNAME ServerTime = Get-Date -Format "MM-dd-yyyy hh:mm:ss tt" } } # 将远程返回的数据传入函数 writeToServer -server $remoteData.ComputerName -Time $remoteData.ServerTime }
关键说明
- 远程脚本块返回一个自定义对象,包含需要的两个字段,本地通过
$remoteData接收 - 不再尝试跨会话访问变量,而是利用
Invoke-Command的返回值传递数据,这是PowerShell远程处理的标准方式 - 统一了变量大小写(原代码参数用
$server,SQL语句里用$SERVER,虽然PowerShell不区分大小写,但保持一致更规范)
内容的提问来源于stack exchange,提问作者Edgar
相关产品推荐
相关产品推荐

