我写了以下代码:
cls
function GetFoo() {
function GetBar() {
$bar = "bar"
$bar
}
$foo = "foo"
$bar = GetBar
$foo
$bar
}
$cred = Get-Credential "firmwide\srabhi_adm"
$result = Invoke-Command -Credential $cred -ComputerName localhost
-ScriptBlock ${function:GetFoo}
Write-Host $result[0]
Write-Host $result[1]
它可以工作,但我不想在GetFoo
中定义GetBar
。
我能做这样的事情吗?
cls
function GetBar() {
$bar = "bar"
$bar
}
function GetFoo() {
$foo = "foo"
$bar = GetBar
$foo
$bar
}
$cred = Get-Credential "firmwide\srabhi_adm"
$result = Invoke-Command -Credential $cred -ComputerName localhost
-ScriptBlock ${function:GetFoo; function:GetBar; call GetFoo}
Write-Host $result[0]
Write-Host $result[1]
基本上,我是有选择地把我想要的函数放在ScriptBlock中,然后调用其中的一个。这样,我就不必在function内部定义函数,并且可以通过注入我想要成为该ScriptBlock一部分的函数来构造ScriptBlock。
发布于 2012-10-29 17:00:23
问题是Invoke-Command
只能看到ScriptBlock
内部的内容,而不能看到外部定义的函数。如果你真的想-你可以在一行中运行所有的东西,就像这样:
$result = Invoke-Command -ComputerName localhost -ScriptBlock { function GetBar() { $bar = "bar"; $bar }; function GetFoo() { $foo = "foo"; $bar = GetBar; $foo; $bar }; GetFoo }
但我个人建议您将函数保存在脚本中,并使用-FilePath
参数调用Invoke-Command
,如下所示:
$result = Invoke-Command -ComputerName localhost -FilePath "\1.ps1"
发布于 2020-05-24 03:44:12
我知道这是一个老帖子,但我希望它能帮助一些人。
[CmdletBinding()]
param()
$barScriptBlock = {
function GetBar() {
$bar = "bar"
$bar
}
}
$fooScriptBlock = {
function GetFoo() {
$foo = "foo"
$bar = GetBar
$foo
$bar
}
}
# Concatenate all functions into a script block; add a parameter for extra credit.
$scriptBlockString = @"
param(`$hello)
$($barScriptBlock.ToString())
$($fooScriptBlock.ToString())
`$hello
GetFoo
"@
Write-Verbose $scriptBlockString
# Convert combined string to script block.
$finalScriptBlock = [ScriptBlock]::Create($scriptBlockString)
# Run synchronously, passing runtime parameter.
$result = & $finalScriptBlock "Hola"
# (Async results would not be reiably accessed here yet.)
Write-Host $result[0]
Write-Host $result[1]
Write-Host $result[2]
发布于 2021-03-17 23:42:09
在Joe Zamora's answer的基础上,这里有一个我认为更适合这个问题的命令:
$result = Invoke-Command -Credential $cred -ScriptBlock ([ScriptBlock]::Create("${function:GetFoo}; ${function:GetBar}; GetFoo"))
https://stackoverflow.com/questions/13100945
复制相似问题