假设我有3个功能; A,B和C.显然这是超级淡化,但逻辑是存在的。
A是收集名称的函数。
function A {
Set-Variable -Scope Script -Name "First" -Value (Read-Host "First name?")
Set-Variable -Scope Script -Name "Last" -Value (Read-Host "Last name?")
}
功能B将使用此名称创建具有msol会话的O365用户。没什么大不了的。
function B {
Connect-MsolService -Credential $creds
"Add user foo"
$Name = "$Script:First $Script:Last"
"Success!"
}
虽然函数C使用A中的名称,但在PSSession中将其引用到远程AD服务器。这是我的知识完全崩溃的地方。我已经尝试了所有我在C中引用这些局部变量的知识。
function C {
New-ADUser
$Name = "$Script:First $Script:Last"
}
New-PSSession -computername AD -credential $ADcreds
Invoke-Command -ComputerName AD -ScriptBlock ${function:C} -credential $ADcreds
Remove-PSSession $s0
但他们完全被抹去了。我试图先调用一个脚本块,然后使用旧数据再次定义它们,没有运气。我的$Script:Name
在PSSession中总是出现空值。
我错过了一些巨大的东西吗?
答案 0 :(得分:2)
using:
变量前缀应该在这里工作。如果没有,则应在函数中定义Param
部分,并使用-Argument
参数将参数传递给Invoke-Command
cmdlet。
$scriptBlockC = {
New-ADUser
$Name = "$using:First $using:Last"
}
Invoke-Command -ComputerName AD -ScriptBlock $scriptBlockC -credential $ADcreds
请注意,我删除了function关键字,因为您只是定义了一个scriptblock。