我在使用Powershell 4.0的Win 7机器上
PS C:\> $psversiontable
Name Value
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.42000
BuildVersion 6.3.9600.18728
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2
参见下面的命令行练习。dll存在。环境变量存在并具有正确的路径。当我在Test-Path
中使用环境变量时,它不正确地报告$false
。当我在Test-Path
中使用字符串文字时,它正确地报告了$true
当我使用环境变量时,为什么Test-Path
不正确地报告false?
PS C:\> dir "C:\Program Files (x86)\Gemalto\NET Smartcard Framework SDK\v2.3.0\bin\SmartCard.Runtime.dll"
Directory: C:\Program Files (x86)\Gemalto\NET Smartcard Framework SDK\v2.3.0\bin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 1/13/2012 6:57 PM 131072 SmartCard.Runtime.dll
PS C:\> Write-Host $env:GEMALTO_SMARTCARD_DLL
"C:\Program Files (x86)\Gemalto\NET Smartcard Framework SDK\v2.3.0\bin\SmartCard.Runtime.dll"
PS C:\> Test-Path $env:GEMALTO_SMARTCARD_DLL
False
PS C:\> Test-Path "C:\Program Files (x86)\Gemalto\NET Smartcard Framework SDK\v2.3.0\bin\SmartCard.Runtime.dll"
True
发布于 2018-04-13 14:10:09
在打印Write-Host $env:GEMALTO_SMARTCARD_DLL
时,您可以看到环境变量GEMALTO_SMARTCARD_DLL
包含文字"
作为其值的一部分。这是不正确的。例如,在传递到Test-Path
:$env:GEMALTO_SMARTCARD_DLL.Trim('"')
之前,您应该删除它们。
注意:虽然"
是文件系统路径的无效字符,但它并不是PowerShell路径的无效字符,因为它并不仅限于文件系统。
New-PSDrive -Name '"C' -PSProvider Variable -Root \
${Program Files (x86)\Gemalto\NET Smartcard Framework SDK\v2.3.0\bin\SmartCard.Runtime.dll"} = 'Value'
Test-Path $env:GEMALTO_SMARTCARD_DLL
发布于 2018-04-13 14:08:00
您的问题不在于环境变量(它们只是不同驱动器中的变量-- Env:
与Variable:
),而是与环境变量的内容有关。如果要在cmd中创建此变量,则应使用以下语法:
SET "GEMALTO_SMARTCARD_DLL=C:\Program Files(x86)\.."
PowerShell中的参数比批处理参数稍微聪明一些,并且传递变量可以作为参数的全部,而不管它的内容如何。
在特定情况下,变量将引号字符作为内容的一部分,这对Test-Path
没有意义
PS C:\> $Env:GEMALTO_SMARTCARD_DLL
"C:\Program Files (x86)\Gemalto\NET Smartcard Framework SDK\v2.3.0\bin\SmartCard.Runtime.dll"
您可以通过修复环境变量的声明来解决这个问题,也可以在代码中修复它:
$GEMALTO_SMARTCARD_DLL = $Env:GEMALTO_SMARTCARD_DLL -replace '^"' -replace '"$'
https://stackoverflow.com/questions/49817534
复制相似问题