远程服务器传递参数运行PowerShell脚本报错求助
问题描述
我尝试读取如下格式的JSON文件:
[ { "STORE": "1", "LocationUUID": "ABC" }, { "STORE": "2", "LocationUUID": "DEF" } ]
需求是循环遍历每个门店,将对应的LocationUUID作为参数传递给另一个PowerShell脚本,并在门店1和门店2的服务器上运行该脚本。
执行脚本如下:
$storeLocationUUIDJSON = Get-Content '{my path here}' -Raw | ConvertFrom-Json $storeLocationUUIDJSON | Select-Object -Property STORE, LocationUUID | ForEach-Object { $computer = $_.STORE $location = $_.LocationUUID $filepath = 'test.ps1' Write-Host "Started running the script on Store" + $computer + $location try{ Invoke-Command -ComputerName $computer -FilePath $filepath -LocationUUID $location } catch { Write-Host "Not successful on Store" + $computer Write-Host $_.Exception.Message } }
目标测试脚本如下:
param( [Parameter(Mandatory = $true)] $LocationUUID ) Write-host $LocationUUID New-Item 'T:\test.txt' -type file
运行时出现错误:A parameter cannot be found that matches the parameter name 'LocationUUID'
错误原因
Invoke-Command本身没有-LocationUUID这个参数,你错误地将目标脚本的参数直接当作Invoke-Command的参数使用,导致参数不匹配报错。传递参数给远程执行的脚本,需要用Invoke-Command专门的参数来实现。
解决方法
提供两种可行的修改方案:
方案1:使用-ArgumentList传递位置参数
修改执行脚本中的Invoke-Command部分:
Invoke-Command -ComputerName $computer -FilePath $filepath -ArgumentList $location
目标测试脚本无需修改,-ArgumentList会按位置将参数传递给远程脚本的param块,因为只有一个参数,能被$LocationUUID正确接收。
方案2:使用-Parameter传递命名参数(PowerShell 5.1及以上版本支持)
修改执行脚本中的Invoke-Command部分,通过哈希表按参数名传递:
Invoke-Command -ComputerName $computer -FilePath $filepath -Parameter @{ LocationUUID = $location }
这种方式无需修改目标脚本,直接按参数名匹配传递,可读性更强。
额外优化建议
Write-Host的字符串拼接建议用双引号插值替代+号,输出格式更规范:Write-Host "Started running the script on Store $computer (UUID: $location)"- 默认情况下
Invoke-Command的远程错误不会触发本地catch块,需添加-ErrorAction Stop才能捕获异常:try{ Invoke-Command -ComputerName $computer -FilePath $filepath -Parameter @{ LocationUUID = $location } -ErrorAction Stop }
内容的提问来源于stack exchange,提问作者Laba Ningombam
相关产品推荐
相关产品推荐

