问题) 如何让DSC脚本资源等到代码完成后再继续? (代码是invoke-expression" path \ file.exe")
详细信息) 我使用的是powershell版本5 我正在尝试使用DSC设置来处理我们的sql server安装。 我的经理要我使用开箱即用的DSC组件。 即不下载可能有用的自定义模块。 我已经构建了处理基本服务器构建的配置文件 - 一切都很好。 安装sql server的脚本资源很好。 它会执行,并等待它完全安装,然后再继续。 当我到达安装sql server累积更新的脚本资源时,我遇到了问题。 可执行文件被调用并开始安装(它需要10-15分钟),但dsc配置不会等到它安装完毕,并在一秒钟之后继续运行。 这意味着在安装完成之前,将调用DependsOn以用于将来的步骤。 如何让脚本资源等到它完成后才能使用?
答案 0 :(得分:2)
您是否尝试过关键字“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"
}
答案 1 :(得分:0)
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;