带参数的 Powershell startjob 导入模块调用函数
Posted
技术标签:
【中文标题】带参数的 Powershell startjob 导入模块调用函数【英文标题】:Powershell startjob import-module call function with arguments 【发布时间】:2022-01-15 16:52:43 【问题描述】:所以我正在尝试从我编写的模块开始工作。
复制模块.psm1
function startcopy([string] $ShowToCopy)
if (-not($ShowToCopy)) return "No name provided. Doing nothing."
else return "Name Provided $ShowToCopy"
在主脚本中我这样称呼它:
$Copyname = "test"
Start-Job -Name "copy1" -InitializationScript Import-Module -Name .\Copy-Modules.psm1 -ScriptBlock startcopy -ArgumentList $Copyname
然而,争论似乎从来没有通过。无论我如何格式化或使用 switch 传递参数,我总是得到结果没有提供名称。什么都不做。
【问题讨论】:
用引号将路径括起来和/或使用完整路径,而不是相对路径。 【参考方案1】:最简单的解决方案 - 假设您不需要 Copy-Modules.psm1
模块中的其他函数 - 是将函数的 body 作为 Start-Job
的 -ScriptBlock
参数传递:
Start-Job -Name "copy1" -ScriptBlock $function:startcopy -ArgumentList $Copyname
$function:startcopy
使用namespace variable notation 来获取startcopy
的body 作为script block。
注意:
这消除了在后台作业范围内定义 startcopy
函数的需要(这是子进程中的一个独立会话,对调用者的状态一无所知),这就是你的 -InitializationScript
脚本块所做的.
这种方式唯一的限制是脚本块不会被命名,即丢失了原来的函数名,函数内部的$MyInvocation.MyCommand.Name
返回的是空字符串。
至于你尝试了什么:
脚本块作为一个整体接收(总是位置参数传递给-ArgumentList
,你将拥有显式传递到脚本块内调用的任何命令,使用automatic $args
variable:
$Copyname = "test"
# Note the use of $args[0]
Start-Job -Name "copy1" `
-InitializationScript Import-Module -Name .\Copy-Modules.psm1 `
-ScriptBlock startcopy $args[0] -ArgumentList $Copyname
【讨论】:
以上是关于带参数的 Powershell startjob 导入模块调用函数的主要内容,如果未能解决你的问题,请参考以下文章
powershell 将新的提示链接添加到SharePoint列表。也是在powershell中使用带参数的函数的示例。
PowerShell 中的构造函数链接 - 调用同一类中的其他构造函数