Powershell: проверьте, существует ли сетевой диск, если нет, сопоставьте его, затем дважды проверьте

Я пытаюсь написать простой скрипт, чтобы проверить, доступен ли сетевой диск, сопоставить его, если это не так, а затем дважды проверить обработанное отображение (сообщить о любых проблемах, таких как сопоставление учетной записи, которое оно истекло и т.д.). Если это не удастся при двойной проверке, оно отправит электронное письмо, в противном случае он будет сообщать обо всем в порядке.

Я не могу заставить двойную проверку работать. Я думаю, что мои утверждения ошибочны?

$Networkpath = "X:\Testfolder" 
$pathExists = Test-Path -Path $Networkpath

If (-not ($pathExists)) {
(new-object -com WScript.Network).MapNetworkDrive("X:","\\Server-01\Share")
}

ELSEIF (-not ($pathExists)) {
Write-Host "Something went very wrong"
#Insert email code here 
}

ELSE {Write-Host "Drive Exists already"}
2 ответа

Мне нравится ответ Джеймса, но я хочу объяснить, почему у вас эта проблема. Причина, по которой ваша двойная проверка не срабатывает, заключается в том, что вы на самом деле проверяете только один путь.

В начале кода вы проверяете, существует ли путь на этих двух строках

$Networkpath = "X:\Testfolder" 
$pathExists = Test-Path -Path $Networkpath

В этот момент создается переменная $pathExists и сохраняет результат с этого момента времени. Поэтому, если вы дважды проверяете, не сработал ли код позже, он фактически использует тот же вывод с первого раза.

Код продолжает проверять, существует ли путь, а если нет, то создается путь.

If (-not ($pathExists)) {
(new-object -com WScript.Network).MapNetworkDrive("X:","\\Server-01\Share")
}

Что вам нужно сделать, это добавить еще один тест здесь, тогда вы узнаете, что диск уже существует.

Я добавил дополнительный тест для вас и немного изменил поток через скрипт с выводом Write-Host для каждой ветки. Здесь полный код.

$Networkpath = "X:\Testfolder" 
$pathExists = Test-Path -Path $Networkpath

If (-not ($pathExists)) {
(new-object -com WScript.Network).MapNetworkDrive("X:","\\Server-01\Share")
}
else {
Write-host "Path already existed"
Return #end the function if path was already there
}

#Path wasn't there, so we created it, now testing that it worked

$pathExists = Test-Path -Path $Networkpath

If (-not ($pathExists)) {
Write-Host "We tried to create the path but it still isn't there"
#Insert email code here 
}

ELSE {Write-Host "Path created successfully"}


Вы можете использовать if внутри if (вложенное if) выполнить проверку после того, как диск был сопоставлен.

Я также изменил логику первой проверки, поэтому он не использует -not поскольку он делает код более простым.

$Networkpath = "X:\Testfolder" 


If (Test-Path -Path $Networkpath) {
 Write-Host "Drive Exists already"
}
Else {
 #map network drive
 (New-Object -ComObject WScript.Network).MapNetworkDrive("X:","\\Server-01\Share")

 #check mapping again
 If (Test-Path -Path $Networkpath) {
 Write-Host "Drive has been mapped"
 }
 Else {
 Write-Host "Something went very wrong"
 }
}

licensed under cc by-sa 3.0 with attribution.