如何在 Powershell 运行空间中定义函数并执行它
How to define a function in a Powershell runspace and execute it
我想在 powershell 中定义一个函数并在不同的运行空间中执行它。
我试过这个:
Function Add-Message {
param(
[parameter(mandatory=$true)][String]$pMessage
)
("--$pMessage--") | Out-File -FilePath "D:\Temp\test.log" -Append
}
$initialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::Create()
$definition = Get-Content Function:\Add-Message -ErrorAction Stop
$addMessageSessionStateFunction = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList 'Add-Message', $definition
$initialSessionState.Commands.Add($addMessageSessionStateFunction)
$newRunspace = [runspacefactory]::CreateRunspace($initialSessionState)
$newRunspace.ThreadOptions = "ReuseThread"
$newRunspace.Open()
$newPowershell = [PowerShell]::Create()
$newPowershell.AddScript({
Add-Message -pMessage "New runspace"
}) | Out-Null
$newPowershell.Runspace = $newRunspace
$newPowershell.BeginInvoke() | Out-Null
消息 "New runspace" 没有出现在文件 test.log 中
做这样的事情有什么建议吗?
谢谢
在创建初始会话状态时使用 CreateDefault 方法而不是 Create。如果您不这样做,您需要进行更多配置才能使该会话状态可行。
$initialSessionState = [InitialSessionState]::CreateDefault()
克里斯
编辑:添加了示例。
我想在 powershell 中定义一个函数并在不同的运行空间中执行它。 我试过这个:
Function Add-Message {
param(
[parameter(mandatory=$true)][String]$pMessage
)
("--$pMessage--") | Out-File -FilePath "D:\Temp\test.log" -Append
}
$initialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::Create()
$definition = Get-Content Function:\Add-Message -ErrorAction Stop
$addMessageSessionStateFunction = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList 'Add-Message', $definition
$initialSessionState.Commands.Add($addMessageSessionStateFunction)
$newRunspace = [runspacefactory]::CreateRunspace($initialSessionState)
$newRunspace.ThreadOptions = "ReuseThread"
$newRunspace.Open()
$newPowershell = [PowerShell]::Create()
$newPowershell.AddScript({
Add-Message -pMessage "New runspace"
}) | Out-Null
$newPowershell.Runspace = $newRunspace
$newPowershell.BeginInvoke() | Out-Null
消息 "New runspace" 没有出现在文件 test.log 中 做这样的事情有什么建议吗? 谢谢
在创建初始会话状态时使用 CreateDefault 方法而不是 Create。如果您不这样做,您需要进行更多配置才能使该会话状态可行。
$initialSessionState = [InitialSessionState]::CreateDefault()
克里斯
编辑:添加了示例。