在通过远程模块运行命令和在powershell中执行Invoke-Command之间的区别

我正在试图清理一些我们已有的脚本,并遇到了一个有趣的问题。 如果我使用以下来加载远程模块(在这种情况下ActiveDirectory):

$cred= Get-Credential $session= New-PSSession -ComputerName dc1 -Credential $cred Invoke-Command -ScriptBlock {Import-Module ActiveDirectory} -Session $session Import-PSSession -Session $session -module ActiveDirectory -Prefix Rem 

使用New-RemADUser -samaccountname $samname -etc创build一个新的用户帐户一切都按预期工作。

但是,如果我尝试将其放入函数中,而没有错误,则不会创build新帐户。

例:

 function newuser{ param([string]$givenname,[string]$surname,$etc) New-RemADUser -GivenName $givenname -SurName... } $gname= Read-Host "Given name" ... newuser($gname,$sname,$samname) 

所以我的问题是,该函数可以不查看New-RemADUser cmdlet,尽pipe它运行在相同的脚本范围内? 我将不得不使用Invoke-Command -Session $ session New-ADUser …为了使函数工作? 或者是有一些最好的做法或显而易见的原因,我最初的方式来尝试它不会工作(值不正确,远程命令不存在,在function内,等)。

当你调用一个PowerShell函数时,参数不像逗号分隔,就像在C#中一样。 当你像这样调用你的函数:

 newuser($a,$b,$c) 

parsing器将($a,$b,$c)视为一个单独的参数,并且由于newuser期望第一个参数是一个string,parsing器会尝试将其转换为单个string – 这相当于调用:

 newuser -GivenName "$a $b $c" 

尝试使用分隔参数的空格来调用它,或者,如果您想绝对确定,请明确指定参数名称:

 newuser -GivenName $gname -Surname $surname -SamAccountName $etc