DSC脚本资源不读取environement变量

时间:2016-08-09 18:39:07

标签: powershell dsc

我有一个DSC配置,安装nodejs,将npm添加到环境Path变量,然后安装一个npm模块。

    xPackage InstallNodeJs {
        Name = 'Node.js'
        Path =  "$env:SystemDrive\temp\node-v4.4.7-x64.msi"
        ProductId = '8434AEA1-1294-47E3-9137-848F546CD824'
        Arguments = "/quiet"
    }

    Environment AddEnvironmentPaths
    {
        Name = "Path"
        Ensure = "Present"
        Path = $true
        Value = "$env:SystemDrive\ProgramData\npm"
    }

    Script UpgradeNpm {
        SetScript = {
            & npm install --global --production npm-windows-upgrade               
            & npm-windows-upgrade --npm-version 3.10.6
        }
        TestScript = {
            $npmVersion = & npm -v
            return $npmVersion -eq "3.10.6"
        }
        GetScript = { 
            return {@{Result = "UpgradeNpm"}}
        }
     }

安装nodejs并将npm添加到Path变量似乎是成功的。 nodejs和npm位置都添加到Path中,我可以在powershell和cmd中使用它们。

然而,脚本资源会返回' npm'不被视为内部或外部指令...... 对于在npm-windows-upgrade脚本文件中使用的节点也是如此。

你知道为什么Script资源无法读取新添加的Path entires吗?

3 个答案:

答案 0 :(得分:2)

环境DSC资源实现通过更新存储在注册表中的值来进行更改(除了针对Process的变量)。对存储在注册表中的环境变量所做的更改不会反映在当前会话中(在会话启动时读取一次)。

您可以通过以下方式影响当前会话中存储的值:

  1. 使用System.Environment.SetEnvironmentVariable[System.Environment]::SetEnvironmentVariable
  2. 修改$env:<VariableName>
  3. 其中,只有第一个允许您编写持久更改。后者可以被认为是一个不稳定的变化。

    这是资源的一个奇怪的限制,我之前看过这个并觉得有点缺乏。

答案 1 :(得分:1)

那里没有相关信息,因此您无法依靠Environment资源之前运行的Script资源。您的帖子中没有足够的信息来判断是否确实如此,但您应该考虑控制它:

xPackage InstallNodeJs {
    Name = 'Node.js'
    Path =  "$env:SystemDrive\temp\node-v4.4.7-x64.msi"
    ProductId = '8434AEA1-1294-47E3-9137-848F546CD824'
    Arguments = "/quiet"
}

Environment AddEnvironmentPaths
{
    Name = "Path"
    Ensure = "Present"
    Path = $true
    Value = "$env:SystemDrive\ProgramData\npm"
    DependsOn = '[xPackage]InstallNodeJs'
}

Script UpgradeNpm {
    SetScript = {
        & npm install --global --production npm-windows-upgrade               
        & npm-windows-upgrade --npm-version 3.10.6
    }
    TestScript = {
        $npmVersion = & npm -v
        return $npmVersion -eq "3.10.6"
    }
    GetScript = { 
        return {@{Result = "UpgradeNpm"}}
    }

    DependsOn = '[Environment]AddEnvironmentPaths'
 }

答案 2 :(得分:0)

您能分享您使用的DSC版本吗?您可以通过在PowerShell控制台上执行$ PSVersionTable来实现此目的。我能够添加到PATH变量并在脚本资源中使用它。

configuration NPMTest
{

  Environment AddEnvironmentPaths
  {
    Name = 'Path'
    Ensure = 'Present'
    Path = $true
    Value = "$env:SystemDrive\ProgramData\npm"    
  }

  Script p
  {
    GetScript = {@{}}
    TestScript = {return $false}
    SetScript = {$a = & a.ps1 ; Write-Verbose $a -Verbose}
 }
}

脚本a.ps1执行正常,即使我没有指定脚本的完整路径。