PowerShell-测试路径

PowerShell-测试路径,powershell,Powershell,我有一个脚本,可以获取主机上的驱动器并输出到文本文件。文本文件将包含如下内容- D: E: F: G: 我需要测试每个驱动器的路径,如果为true,则将其分配给一个变量 到目前为止,我有以下内容,但它不起作用 Get-WmiObject win32_logicaldisk -Filter "DriveType=3 AND DeviceID!='C:'" | Select DeviceID | Format-Table -HideTableHeaders > c:\DeviceID.txt

我有一个脚本,可以获取主机上的驱动器并输出到文本文件。文本文件将包含如下内容-

D:
E:
F:
G:
我需要测试每个驱动器的路径,如果为true,则将其分配给一个变量

到目前为止,我有以下内容,但它不起作用

Get-WmiObject win32_logicaldisk -Filter "DriveType=3 AND DeviceID!='C:'" | Select DeviceID | Format-Table -HideTableHeaders > c:\DeviceID.txt -Force
$DeviceID = Get-Content C:\DeviceID.txt
$DeviceID | ForEach {$_.TrimEnd()} | ? {$_.trim() -ne '' } > c:\DeviceID.txt

$DeviceID = Get-Content C:\DeviceID.txt
$Path = "$DeviceID\Apps\NetprobeNT\"
$PathExists = Test-Path $Path

ForEach-Object ($DeviceID in $DeviceID)
{
    If ($PathExists -eq $True)
    {
        $DeviceDrive = $DeviceID}
    Else
    {
        $DeviceDrive = "C:"
    }
}

我遇到了另一种有效的方法:

$Folder = "Apps\NetprobeNT"
Get-PSDrive | Where-Object {
    $_.root -match "[C-Z]:\\" -and (Test-Path $(Join-Path $_.root $Folder))
}

使用的最佳方法是什么?

$DeviceID
存在之前,您正在将
测试路径的结果保存到循环外部的
$PathExists
-变量中。结果总是
false
。变量从不更改,因此每次在循环中都将
false
。您需要在循环内运行
测试路径

此外,应避免将wmi输出保存并读取到文件中。尝试:

$DeviceDrive = "C:"

Get-WmiObject win32_logicaldisk -Filter "DriveType=3 AND DeviceID!='C:'" |
Where-Object { Test-Path "$($_.DeviceID)\Apps\NetprobeNT\" } |
Foreach-Object {
    $DeviceDrive = $_.DeviceID
}

$DeviceID
存在之前,您正在将
测试路径的结果保存到循环外部的
$PathExists
-变量中。结果总是
false
。变量从不更改,因此每次在循环中都将
false
。您需要在循环内运行
测试路径

此外,应避免将wmi输出保存并读取到文件中。尝试:

$DeviceDrive = "C:"

Get-WmiObject win32_logicaldisk -Filter "DriveType=3 AND DeviceID!='C:'" |
Where-Object { Test-Path "$($_.DeviceID)\Apps\NetprobeNT\" } |
Foreach-Object {
    $DeviceDrive = $_.DeviceID
}

哇,你真的很难做到

$drives = (Get-WmiObject Win32_Logicaldisk -Filter "DriveType=3 AND DeviceID!='C:'" | Select -ExpandProperty DeviceID).TrimEnd()

$deviceDrive = "C:"
foreach ($drive in $drives) {
    if (test-path "$drive\Apps\NetprobeNT\") {
        $deviceDrive = $drive
    }
}
对于PowerShell V2:

$drives = Get-WmiObject Win32_Logicaldisk -Filter "DriveType=3 AND DeviceID!='C:'"

$deviceDrive = "C:"
foreach ($driveEntry in $drives) {
    $drive = $driveEntry.DeviceId
    if (test-path "$drive\Apps\NetprobeNT\") {
        $deviceDrive = $drive
    }
}

哇,你真的很难做到

$drives = (Get-WmiObject Win32_Logicaldisk -Filter "DriveType=3 AND DeviceID!='C:'" | Select -ExpandProperty DeviceID).TrimEnd()

$deviceDrive = "C:"
foreach ($drive in $drives) {
    if (test-path "$drive\Apps\NetprobeNT\") {
        $deviceDrive = $drive
    }
}
对于PowerShell V2:

$drives = Get-WmiObject Win32_Logicaldisk -Filter "DriveType=3 AND DeviceID!='C:'"

$deviceDrive = "C:"
foreach ($driveEntry in $drives) {
    $drive = $driveEntry.DeviceId
    if (test-path "$drive\Apps\NetprobeNT\") {
        $deviceDrive = $drive
    }
}


您只是重构了他的代码而没有修复错误,它仍然会将
$DeviceDrive
设置为“C:”如果检查的第二个驱动器没有路径,但第一个驱动器有路径,您需要在循环之外设置“$DeviceDrive”的初始值。谢谢,太快了。从ISE复制了错误的样本。:-)@弗罗德,你好,谢谢你的快速回复。我刚试过你的建议,结果不正确。它似乎总是将$DeviceDrive定义为“c:”。大家好,所以我尝试了以下操作,但没有任何乐趣-$DeviceId=Get-WmiObject win32_logicaldisk-Filter“DriveType=3,DeviceId!='c:'”|选择对象DeviceId$DeviceId | ForEach对象{If(测试路径“$DeviceId\Apps\NetprobeNT\”){$DeviceDrive=$DeviceId}Else{$DeviceDrive=“C:”}}刷新页面。这是旧答案:-)您只是重构了他的代码而没有修复错误,它仍然会将
$DeviceDrive
设置为“C:”如果检查的第二个驱动器没有路径,但第一个驱动器有路径,则您需要在环路外设置“$DeviceDrive”的初始值。谢谢,太快了。从ISE复制了错误的样本。:-@Frode,您好,感谢您的快速响应。我刚刚尝试了您的建议,但它给了我错误的结果。它似乎总是将$DeviceDrive定义为“c:”。大家好,所以我尝试了以下操作,但没有任何乐趣-$DeviceId=Get-WmiObject win32_logicaldisk-Filter“DriveType=3,DeviceId!='c:'”|选择对象DeviceId$DeviceId | ForEach对象{If(测试路径“$DeviceId\Apps\NetprobeNT\”{$DeviceDrive=$DeviceId}Else{$DeviceDrive=“C:”}刷新页面。这是旧的答案:-)我在您的脚本中遇到错误。可能是因为我使用的是powershell 2.0,它不喜欢-expandproperty….?错误-获取Wmi对象:无效查询…..是的,可能是,我认为这是一个v3功能…我将为v2Strange更新。
选择对象-expandproperty
与v2兼容。它仍然是iling..I get,“get-WMIOObject:Invalid queryIt是WMI类名中的一个输入错误。现已更新..您的第一条注释中的错误实际上是
get-WMIOObject:Invalid query…
,所以这就是问题的根源。
(get-WMIOObject…).TrimEnd()
在PS 2.0中仍然会失败,因为它是PS3功能,所以替代方案很有用。:-)我在您的脚本中遇到错误。可能是因为我使用的是powershell 2.0,它类似于-expandproperty…?错误-获取Wmi对象:无效查询…。是的,我认为这是一个v3功能…我将为v2Strange更新。
选择对象-ExpandProperty
与v2兼容。它仍然失败..我得到,“get-wmiobject:Invalid queryIt是WMI类名中的一个输入错误。现在更新..您第一条评论中的错误实际上是
get-wmiobject:Invalid query…
,所以从一开始就是问题。
(get-wmiobject…).TrimEnd()
在PS 2.0中仍然会失败,因为它是PS3的一项功能,所以替代方案很有用。:-)最好的方法是您和您的团队最支持的方法。您的第一个解决方案依赖于WMI,并且将远程工作,前提是您允许访问您的计算机,并且WMI正在工作。
获取PSDrive
解决方案没有行为与WMI解决方案相同。您在WMI版本中过滤
DriveType=3
(逻辑磁盘)。这将排除存储卡、usb驱动器、网络驱动器等,并且您将只获得物理安装的驱动器。
get PSDrive
将包括所有类型(这也可以通过删除wmi版本中的
DriveType=3
-过滤器来实现)。感谢您的投入。我将坚持使用Frode F。解决方案,因为我有多种主机操作系统,这将需要在其上运行,并且内存占用较少。最好的方法是您和您的团队最支持的方法。您的第一个解决方案依赖于WMI,并且将远程工作,前提是您允许访问您的计算机,并且WMI是wo正在运行。
Get-PSDrive
解决方案的行为与WMI解决方案不同。您在WMI版本中筛选
DriveType=3
(逻辑磁盘)。这将排除存储卡、usb驱动器、网络驱动器等,您将只获得物理安装的驱动器。
Get-PSDrive
将包括所有类型(您也可以通过删除wmi版本中的
DriveType=3
-过滤器来实现)。感谢您的两个输入。我将坚持使用Frode F。解决方案,因为我有多种主机操作系统,这需要