You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将本地变量传递至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:12:53