【问题标题】:DSC Script Resource - executes .exe, but doesn't wait until completionDSC 脚本资源 - 执行 .exe,但不等到完成
【发布时间】:2017-09-13 00:58:27
【问题描述】:

问题) 如何让 DSC 脚本资源等到代码完成后再继续? (代码为invoke-expression "path\file.exe")

详情) 我正在使用 powershell 版本 5 并试图让 DSC 设置来处理我们的 sql server 安装。 我的经理要求我使用开箱即用的 DSC 组件。 即不下载可能有帮助的自定义模块。 我已经建立了处理基础服务器构建的配置文件——一切都很好。 安装sql server的脚本资源好。 它会执行,并等待它完全安装,然后再继续。 当我开始使用安装 sql server 累积更新的脚本资源时,我遇到了问题。 可执行文件被调用并开始安装(它应该需要 10-15 分钟),但 dsc 配置不会等到它安装完成,而是在一秒钟后继续。 这意味着,在安装完成之前,将调用 DependsOn 以用于将来的步骤。 如何让脚本资源等到它完成?

【问题讨论】:

    标签: sql powershell dsc


    【解决方案1】:

    你试过这样的关键字“DependsOn”吗?

    Script MyNewSvc
    {
        GetScript = {
            $SvcName = 'MyNewSvc'
    
            $Results = @{}
            $Results['svc'] = Get-Service $SvcName
    
            $Results
        }
        SetScript = {
            $SvcName = 'MyNewSvc'
    
            setup.exe /param
            while((Get-Service $SvcName).Status -ne "Running"){ Start-Sleep 10 }
        }
        TestScript = {
            $SvcName = 'MyNewSvc'
            $SvcLog = 'c:\svc.log'
    
            If (condition) { #like a a running svc or a log file
                $True
            }
            Else {
                $False
            }
    
        }
    }
    
    
    WindowsFeature Feature
    {
        Name = "Web-Server"
        Ensure = "Present"
        DependsOn = "[Script]MyNewSvc"
    }
    

    【讨论】:

    • 谢谢你,是的,我试过依赖。自从这篇文章以来,我已经弄清楚是什么导致了这个问题。进行sql补丁的累积更新文件,产生一个解包窗口(类似于解压缩),当这开始解包所需文件时,焦点返回到powershell,并且powershell认为任务已经完成并继续前进。作为一种解决方法,我手动解压缩了所有 sql 修补文件,现在直接调用安装程序。它占用了更多空间,但它已经解决了我的问题。
    【解决方案2】:

    Invoke-Expression 似乎不会等到进程完成 - 在通用 PowerShell 控制台中尝试此操作,您将在关闭记事本之前看到命令返回:

    Invoke-Expression -Command "notepad.exe";
    

    您可以改用 Start-Process:

    Start-Process -FilePath "notepad.exe" -Wait -NoNewWindow;
    

    如果你想检查退出代码,你可以这样做:

    $process  = Start-Process -FilePath "notepad.exe" -Wait -NoNewWindow -PassThru;
    $exitcode = $process.ExitCode;
    if( $exitcode -ne 0 )
    {
        # handle errors here
    }
    

    最后,使用命令行参数:

    $process  = Start-Process -FilePath "setup.exe" -ArgumentList @("/param1", "/param2") -Wait -PassThru;
    $exitcode = $process.ExitCode;
    

    【讨论】:

    • 感谢这个 mclayton,我会试试看它是否能解决我的问题。我发现了问题所在。进行sql补丁的累积更新文件,产生一个解包窗口(类似于解压缩),当这开始解包所需文件时,焦点返回到powershell,并且powershell认为任务已经完成并继续前进。作为一种解决方法,我手动解压缩了文件,所以现在它可以工作了。但如果我能让这个工作,它会干净得多。
    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多