将本地变量传递至Invoke-Command时PowerShell脚本执行失败求助
问题:远程PowerShell脚本无法识别本地变量$NewTrusteesList
执行远程PowerShell脚本时出现失败,脚本目标是读取归档名称列表、获取对应归档权限并导出到指定CSV文件。核心问题是本地定义的变量$NewTrusteesList无法在Invoke-Command的远程脚本块中被识别。
原脚本代码
执行失败的片段
PS C:\Windows\system32> Invoke-Command -Session $evServerSession -scriptblock { >> $ListArchiveNames = Get-Content "E:\Utilities\MyScripts\EXOmigration\ArchivePermissions\ArchivesList.txt" >> Foreach ($ArchiveName in $ListArchiveNames) { Get-EVArchive -ArchiveName $ArchiveName | Get-EVArchivePermission | Export-Csv -Path E:\Utilities\MyScripts\EXOmigration\ArchivePermissions\$NewTrusteesList.csv -Append -NoTypeInformation -Force} >> >> }
完整脚本
cls #============== $NewTrusteesList = Read-Host "请输入迁移Transvault组名称" $NewTrusteesList = $NewTrusteesList + "-ArchiveTrustees" + $dateStr New-Item E:\Utilities\MyScripts\EXOmigration\ArchivePermissions\$NewTrusteesList.csv -ItemType File #------------ #--------------------建立EV PowerShell会话----------------------------- $evServerSession = New-PSSession -ComputerName cov-msv-prd009.morganlewis.net -ConfigurationName Microsoft.Powershell32 Invoke-Command -Session $evServerSession -scriptblock { Add-PSSnapin Symantec.EnterpriseVault.PowerShell.Snapin } #--------------------执行相关PS脚本------------------------------- Invoke-Command -Session $evServerSession -scriptblock { $ListArchiveNames = Get-Content "E:\Utilities\MyScripts\EXOmigration\ArchivePermissions\ArchivesList.txt" Foreach ($ArchiveName in $ListArchiveNames) { Get-EVArchive -ArchiveName $ArchiveName | Get-EVArchivePermission | Export-Csv -Path E:\Utilities\MyScripts\EXOmigration\ArchivePermissions\$NewTrusteesList.csv -Append -NoTypeInformation -Force } } #------------------------清理会话---------------------------- $evServerSession | Remove-PSSession
解决方案
PowerShell远程会话中,本地变量默认无法直接在远程脚本块中访问——因为脚本块运行在远程机器的独立上下文里,不共享本地变量作用域。以下是两种可靠的解决方法:
方法1:使用$using:前缀引用本地变量(PowerShell 3.0+)
这是最简洁的方式,在远程脚本块中用$using:变量名直接调用本地变量:
修改后的远程脚本块:
Invoke-Command -Session $evServerSession -scriptblock { $ListArchiveNames = Get-Content "E:\Utilities\MyScripts\EXOmigration\ArchivePermissions\ArchivesList.txt" Foreach ($ArchiveName in $ListArchiveNames) { Get-EVArchive -ArchiveName $ArchiveName | Get-EVArchivePermission | Export-Csv -Path "E:\Utilities\MyScripts\EXOmigration\ArchivePermissions\$using:NewTrusteesList.csv" -Append -NoTypeInformation -Force } }
方法2:通过-ArgumentList传递变量(兼容低版本)
如果使用PowerShell 2.0及以下版本,可通过-ArgumentList参数传递变量,再在脚本块中接收:
方式A:用$args数组接收
Invoke-Command -Session $evServerSession -scriptblock { $csvFileName = $args[0] $ListArchiveNames = Get-Content "E:\Utilities\MyScripts\EXOmigration\ArchivePermissions\ArchivesList.txt" Foreach ($ArchiveName in $ListArchiveNames) { Get-EVArchive -ArchiveName $ArchiveName | Get-EVArchivePermission | Export-Csv -Path "E:\Utilities\MyScripts\EXOmigration\ArchivePermissions\$csvFileName.csv" -Append -NoTypeInformation -Force } } -ArgumentList $NewTrusteesList
方式B:用命名参数接收(可读性更强)
Invoke-Command -Session $evServerSession -scriptblock { param([string]$CsvFileName) $ListArchiveNames = Get-Content "E:\Utilities\MyScripts\EXOmigration\ArchivePermissions\ArchivesList.txt" Foreach ($ArchiveName in $ListArchiveNames) { Get-EVArchive -ArchiveName $ArchiveName | Get-EVArchivePermission | Export-Csv -Path "E:\Utilities\MyScripts\EXOmigration\ArchivePermissions\$CsvFileName.csv" -Append -NoTypeInformation -Force } } -ArgumentList $NewTrusteesList
额外注意:原脚本中$dateStr变量未定义,需提前赋值(例如$dateStr = Get-Date -Format "yyyyMMdd"),否则会导致$NewTrusteesList生成失败。
内容的提问来源于stack exchange,提问作者Tchef
相关产品推荐
相关产品推荐

