【发布时间】:2020-08-06 18:54:03
【问题描述】:
鉴于以下...
- 实现运行空间池的 Powershell 脚本
- 命名脚本块的哈希表
- 调用 New-Object 以创建 SQL 相关对象(SMO、SqlClient 等)的脚本块
我的脚本遍历服务器列表并将每个脚本块及其参数从哈希表添加到运行空间池。一些脚本块调用 New-Object 来实例化各种 .net 对象的实例。
代码是这样的(更新以更准确地反映问题)...
# add, configure and execute runspace script block
$_ps = [Powershell]::Create()
$_ps.RunspacePool = $this._pool
$_script_block = {
$_obj = New-Object Microsoft.SqlServer.Management.Smo.Server($InstanceName)
}
$_wrapper_script_block = { &$_script_block } # returns cmdlet not found error
$_wrapper_script_block = { Invoke-Command -ScriptBlock $_script_block } # works
$null = $_ps.AddScript($_wrapper_script_block)
$null = $_ps.AddParameters($Parms)
# syntax may be off - just for demonstration
[ArrayList] $jobs += @{process = $_ps; handle = $_ps.BeginInvoke()}
问题...
当池中有多个运行空间时,脚本块返回“新对象无法识别...”错误。如果我使用完全相同的代码,但仅将一个包含 New-Object 调用的脚本块(相同的脚本块因多个运行空间而失败)提交到运行空间池,则它可以正常工作。
Microsoft 的文档 (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-7) 说“调用运算符不解析字符串。这意味着在使用调用运算符时不能在字符串中使用命令参数。”我从 & 更改为 Invoke-Command,现在它似乎工作正常。我不完全确定发生了什么。
【问题讨论】:
-
if 语句下面的“v”应该在那里吗?
-
没有。这是一个错字
-
那么为什么不改正错字呢?为什么不提供更多的实际脚本?
-
如果您认为错字可能是问题所在,错字是我尝试格式化帖子的一部分,而不是脚本的一部分。就包含更多的脚本而言,很难猜测哪些代码是有用的。我希望提供的代码足以说明我正在做的事情。
-
有人对我如何解决我的问题有任何建议吗?
标签: powershell runspace new-object