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。解决方案,因为我有多种主机操作系统,这需要