Powershell工作流程中的动态路径

时间:2016-12-13 11:51:55

标签: powershell

我尝试使用变量在Powershell工作流程中指定路径,更具体地说,在工作流程的InlineScript中指定路径。

添加更多上下文:我正在为我的应用程序编写部署脚本。我需要重新启动计算机并继续我的脚本。我通过注册一个在启动时启动另一个脚本的计划任务来实现这一部分。

所以我有一个第一个脚本A,它注册了一些工作,如:

workflow installXming{
    Suspend-Workflow
    InlineScript{
        $scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
        Import-Module "$scriptPath\modules\_install_Xming_fonts.ps1";
        xming_fonts
    }
}

此脚本重新启动计算机并调用第二个脚本B,它恢复暂停的作业:

$jobs = Get-Job -state Suspended
$resumedJobs = $jobs | resume-job -wait
$resumedJobs | wait-job

当我得到我的工作输出时,我的$scriptPath变量出错了。

我知道我无法在Powershell工作流程中使用$PSScriptRoot

我有什么方法可以使用" persitent"变量来存储一些值或有没有办法使用变量来存储我的脚本的路径?

2 个答案:

答案 0 :(得分:0)

从上面我所观察到的:

导入模块仅适用于模块。因此,在您的情况下,我可以看到您正在导入 .ps1 ,这似乎是错误的。它应该是 .psm1

其次, Powershell工作流程拥有自己的范围。要从变量中获取结果值,您必须使用 $ Using:

以下是对脚本的修改,并对应于示例脚本供您参考。

修改了您的脚本

  workflow installXming
{
  Suspend-Workflow
  $scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
  InlineScript{
    Import-Module "$Using:scriptPath\modules\_install_Xming_fonts.psm1"; ## Assuming it as .psm1 file
    xming_fonts
            }
}

示例脚本:

Workflow Stop-MyService
{
    $ServiceName = "MyService"

    $Output = InlineScript {
        $Service = Get-Service -Name $Using:ServiceName
        $Service.Stop()
        $Service
    }

    $Output.Name
}

希望这会对你有所帮助。

答案 1 :(得分:0)

这就是我解决它的方法:

我只是让我的工作流程采用一个参数,这是脚本的当前路径。

workflow myWorkflow{
    param(
    [Parameter(Mandatory=$True, Position=1)]
    [string] $scriptPath
    )
    Suspend-Workflow
    InlineScript{
         Import-Module "$Using:scriptPath\modules\_myMoldule.ps1";
         # DoStuff
    }
}