为什么我的-match调用在获取网络驱动器时包含无效项?

时间:2018-06-14 05:51:45

标签: powershell drive

致电

Get-PsDrive | Select Name,Root

我可以看到跟随的驱动器:

Name       Root                               
----       ----                               
Alias                                         
C          C:\                                
Cert       \                                  
Env                                           
Function                                      
G          \\company.com\EVP\Data\Gen...
HKCU       HKEY_CURRENT_USER                  
HKLM       HKEY_LOCAL_MACHINE                 
Variable                                      
WSMan                                         
X          \\server\C$               
Z          \\server\C$               

大。现在我只想要网络驱动器,即Root包含\\ProviderFileSystem的驱动器。

所以我试过

Get-PSDrive | 
    where {$_.Provider -match "FileSystem" -and $_.Root -match "\\"} 
        | Select -ExpandProperty Name

但由于某些原因,这包括C驱动器。怎么可能?

我也尝试过改为

$_.Root -match "\\\"

但是我得到了

  

解析" \\" - 模式结束时非法\。

$_.Root -match "\\\\"

什么都不返回。

1 个答案:

答案 0 :(得分:-1)

-match在右边使用正则表达式(正则表达式),在正则表达式语言中,反斜杠是一个转义字符,指定反斜杠的方法是用另一个转义它 - 即{{1转换为单个反斜杠,与\\等驱动器匹配。

您的选择是:

C:\

编辑:

  

正如我在问题中提到的那样,当我尝试与' \\'匹配时,我没有得到任何回报价值。

运行$_ -match '\\\\' # two escaped backslashes $_ -match [regex]::Escape('\\') # it returns \\\\ but maybe clearer to a reader what's happening $_.StartsWith('\\') # don't use a regex, use a .Net string method 并看到类似的内容:

Get-PsDrive Z | Format-List -Property *

并显示属性Used : 89738715136 Free : 29716107264 CurrentLocation : Name : Z Provider : Microsoft.PowerShell.Core\FileSystem Root : Z:\ Description : MaximumSize : Credential : System.Management.Automation.PSCredential DisplayRoot : \\localhost\c$ 实际上是驱动器号,UNC路径称为root。我不知道为什么,但看起来输出格式化系统显示DisplayRoot值并将其显示为Root值。但是,这只是在最后的演示步骤中发生的,您无法在脚本中使用它。

@Lieven Keersmaekers'建议使用DisplayRoot是好的。