我有一个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吗?
答案 0 :(得分:2)
环境DSC资源实现通过更新存储在注册表中的值来进行更改(除了针对Process的变量)。对存储在注册表中的环境变量所做的更改不会反映在当前会话中(在会话启动时读取一次)。
您可以通过以下方式影响当前会话中存储的值:
System.Environment.SetEnvironmentVariable
([System.Environment]::SetEnvironmentVariable
)$env:<VariableName>
其中,只有第一个允许您编写持久更改。后者可以被认为是一个不稳定的变化。
这是资源的一个奇怪的限制,我之前看过这个并觉得有点缺乏。
答案 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执行正常,即使我没有指定脚本的完整路径。