Powershell脚本似乎使用通配符执行命令

时间:2014-09-30 22:09:33

标签: powershell vmware

我正在编写将在远程服务器上执行命令的PowerShell脚本。我在脚本中使用单个变量作为该命令的参数。

param(
    [Parameter(Mandatory=$true)][string]$strUser
)

$strDomain = "company.com\\"
$strFQusername = $strDomain + $strUser

$strFQusername
$strFQusername
$strFQusername

Invoke-Command -computername VMwareView.company.com -scriptblock {. $env:userprofile\document\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 ; Get-RemoteSession -username $strFQusername } -credential company.com\administrator

$strFQusername
$strFQusername
$strFQusername

当我执行此脚本时, $ strFQusername 变量似乎被通配符替换。 Get-RemoteSession cmdlet正确执行,但它列出了所有用户的会话,而不仅仅是 $ strFQusername 变量指定的用户。这相当于我输入 Get-RemoteSession -username *

如果我在脚本中硬编码用户名,我会得到预期的输出。也就是说,我只在会话中看到我硬编码到脚本中的用户名。

我尝试在 $ strDomain 变量中使用单反斜杠和双反斜杠,但结果相同。您在Invoke-Command行之前和之后看到的3行 $ strFQusername 用于调试。它们打印出我希望看到存储在 $ strFQusername 中的字符串。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

如果您有 ps3 + ,请使用修饰符$using;如果 ps2

,则使用参数-argumentlist

<强> PS3的+

..Get-RemoteSession -username $using:strFQusername

<强> Ps2的

...{Param ($user)....Get-RemoteSession -username $user} -arg $strFQusername

答案 1 :(得分:0)

scriptblock不知道其外的变量,因此您需要通过-ArgumentList参数将它们传递到scriptblock中:

Invoke-Command -computername VMwareView.company.com -scriptblock {
  . $env:userprofile\document\WindowsPowerShell\Microsoft.PowerShell_profile.ps1;
  Get-RemoteSession -username $args[0]
} -ArgumentList $strFQusername -credential company.com\administrator