为什么当我使用环境变量时,测试路径 cmdlet 错误地报告 false



我在一台使用 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)GemaltoNET Smartcard Framework SDKv2.3.0binSmartCard.Runtime.dll"
    Directory: C:Program Files (x86)GemaltoNET Smartcard Framework SDKv2.3.0bin
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)GemaltoNET Smartcard Framework SDKv2.3.0binSmartCard.Runtime.dll"
PS C:> Test-Path $env:GEMALTO_SMARTCARD_DLL
False
PS C:> Test-Path "C:Program Files (x86)GemaltoNET Smartcard Framework SDKv2.3.0binSmartCard.Runtime.dll"
True    

打印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)GemaltoNET Smartcard Framework SDKv2.3.0binSmartCard.Runtime.dll"} = 'Value'
Test-Path $env:GEMALTO_SMARTCARD_DLL

您的问题不是由于环境变量(它们只是不同驱动器中的变量 - Env:Variable: (,而是环境变量的内容。 如果要在 cmd 中创建此变量,则应使用以下语法:

SET "GEMALTO_SMARTCARD_DLL=C:Program Files(x86).."

PowerShell 中的参数比批处理参数聪明一些,传递变量将计为整个参数,无论其内容如何。

在您的特定情况下,您的变量将引号字符作为内容的一部分,这对Test-Path没有意义:

PS C:> $Env:GEMALTO_SMARTCARD_DLL
"C:Program Files (x86)GemaltoNET Smartcard Framework SDKv2.3.0binSmartCard.Runtime.dll"

可以通过修复环境变量的声明来解决此问题,也可以在代码中修复它:

$GEMALTO_SMARTCARD_DLL = $Env:GEMALTO_SMARTCARD_DLL -replace '^"' -replace '"$'

最新更新