【问题标题】:Use exe from PATH after installing it安装后使用PATH中的exe
【发布时间】:2018-06-25 05:06:14
【问题描述】:

我正在编写一个试图安装 CUDA 并设置环境变量的脚本。因此,它还应该检查 CUDA 是否安装成功。作为这项检查,我运行nvcc -V 来获取编译器版本。不幸的是,由于某种原因,在我打开另一个 shell 窗口之前它不起作用。但我强烈需要这种行为,因为我必须在同一会话中实际运行 nvcc

这是我的脚本:

param([Parameter(mandatory=$true)][string] $FileName)
$VERSION = "9.1"
$argumentList = "-s nvcc_$VERSION cublas_$VERSION cublas_dev_$VERSION cufft_$VERSION cufft_dev_$VERSION npp_$VERSION npp_dev_$VERSION"
$envPath = ";%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v$VERSION\bin;%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v$VERSION\libnvvp";
Write-Host "Install CUDA from $FileName with argumentList $argumentList"
Start-Process -FilePath $FileName -ArgumentList $argumentList -Wait

#adding CUDA to PATH
[Environment]::SetEnvironmentVariable("Path", $env:Path + $envPath, [EnvironmentVariableTarget]::Machine) 

#updating PATH for current session
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") 

#trying to run something
nvcc -V 

但是显示错误

术语“nvcc”未被识别为 cmdlet、函数的名称, 脚本文件或可运行的程序。检查名称的拼写,或 如果包含路径,请验证路径是否正确并重试。

怎么做?

PS C:\Users\SOLO> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.16299.98
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.16299.98
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

【问题讨论】:

  • 这个post 重新加载了("Path", "Machine") 的路径 ("Path", "User") - 这有帮助吗?
  • 提供的代码做同样的事情。
  • $env:Path + $envPath -> "${env:Path};${envPath}"
  • PowerShell ISE 是实际脚本中不会发生的问题的丰富来源。为完整起见,请在 PowerShell 窗口中使用 .ps1 中的脚本再次尝试。调整 $env:path 在我的 PS 5.1 窗口中工作。
  • @JeroenMostert 问题不在于%ProgramFiles% 本身,而是SetEnvironmentVariable() 将注册表值写入为 REG_SZ(即使之前是 REG_EXPAND_SZ)。 Windows 仅为 REG_EXPAND_SZ 值扩展注册表值中的%-变量。

标签: powershell


【解决方案1】:

您的问题是由[Environment]::SetEnvironmentVariable()%ProgramFiles% 的组合引起的。 SetEnvironmentVariable() 方法将相应的注册表值写入为 REG_SZ,这意味着该字符串中的环境变量(如 %ProgramFiles%)在使用该变量时不会被扩展。

如果您想继续使用%ProgramFiles%,请将注册表值写入 REG_EXPAND_SZ:

$regkey = 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
Set-ItemProperty -Path $regkey -Name 'Path' -Value "${env:Path};${envPath}" -Type ExpandString

否则使用$env:ProgramFiles而不是%ProgramFiles%,以便用已经展开的路径写入变量:

$envPath = "$env:ProgramFiles\NVIDIA GPU Computing Toolkit\CUDA\v$VERSION\bin;$env:ProgramFiles\NVIDIA GPU Computing Toolkit\CUDA\v$VERSION\libnvvp";
[Environment]::SetEnvironmentVariable("Path", "${env:Path};${envPath}", [EnvironmentVariableTarget]::Machine)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多