带参数的 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 来获取startcopybody 作为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 中创建批处理作业

PowerShell 中的构造函数链接 - 调用同一类中的其他构造函数

带特殊字符的密码参数

powershell PowerShell:脚本模板版本2(带日志记录)

(23)Powershell中的首选项变量