2016-05-09 4 views
0

У меня есть сценарий, который получает диски на хосте и выводит их в текстовый файл. текстовый файл будет что-то вроде ниже -PowerShell - тестовый путь

D: 
E: 
F: 
G: 

Мне нужно проверить каждый диск на пути, и если верно присвоить его переменной.

У меня есть следующее до сих пор, но оно не работает. Я знаю, что это супер очевидно, любая помощь очень ценится.

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)) 
} 

Что является лучшим способом использовать?

+0

Лучший метод является один, который является наиболее поддерживаемую вами и вашей команды. Ваше первое решение зависит от WMI и будет работать удаленно, если вы разрешите доступ к вашим машинам и WMI. – Djarid

+0

Решение 'Get-PSDrive' не ведет себя так же, как WMI-решение. Вы фильтруете 'DriveType = 3' (логический диск) в wmi-версии. Это исключит карты памяти, USB-диски, сетевые диски и т. Д., И вы получите только физически установленные диски. «Get-PSDrive» будет включать все типы (которые вы также можете сделать, удалив фильтр 'DriveType = 3' в wmi-версии). –

+0

Спасибо за оба входа. Я буду придерживаться решения Frode F., поскольку у меня есть множество хостов OS, которые нужно будет запускать и менее интенсивно для памяти. –

ответ

2

Вы сохраняете результат Test-Path на $PathExists -переменный за пределами цикла, до $DeviceID. Результат всегда будет false. Переменная никогда не изменяется, поэтому она будет false каждый раз внутри цикла. Вам нужно запустить Test-Path внутри цикла.

Кроме того, вы должны избегать сохранения и чтения wmi-вывода в файл. Попробуйте:

$DeviceDrive = "C:" 

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

вы просто реорганизовали его код без исправления ошибки, он все равно установит '$ DeviceDrive' на« C: », если 2-й диск не имеет пути, но первый из них, вам нужно будет установить начальное значение из '$ DeviceDrive 'вне цикла – Djarid

+0

Спасибо, пошел слишком быстро. Скопированный неправильный образец из ISE. :-) –

+0

@Frode, Здравствуйте, Спасибо за ваш быстрый ответ. Я только что попробовал ваше предложение, и это дает мне неправильные результаты. Кажется, он определяет $ DeviceDrive как «c:». –

1

вау вы действительно делаете это трудный путь ...

$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 
    } 
} 
+0

Я получаю сообщение об ошибке с вашим скриптом. Может быть, потому, что я использую powershell 2.0, и это похоже на -expandproperty ....? Ошибка - Get-Wmi-object: Неверный запрос ..... –

+0

да, возможно, я думаю, что это функция v3 ... Я обновлю для v2 – Djarid

+0

Странно. 'Select-Object -ExpandProperty' совместим с v2. –