我在一台使用 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 '"$'