我正在编写一个试图安装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
答案 0 :(得分: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)