【问题标题】:Powershell startjob import-module call function with arguments带参数的 Powershell startjob 导入模块调用函数
【发布时间】: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 传递参数,我总是得到结果没有提供名称。什么都不做。

【问题讨论】:

  • 用引号将路径括起来和/或使用完整路径,而不是相对路径。

标签: function powershell arguments start-job scriptblock


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-15
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 2019-11-14
    • 1970-01-01
    相关资源
    最近更新 更多