2017-10-04 8 views
2

ネットワークドライブが使用可能かどうかを確認する簡単なスクリプトを作成しようとしています(誤って期限切れになったアカウントマッピングなどの問題を報告するため)。ダブルチェックで失敗した場合は電子メールを送信し、それ以外の場合はすべてエラーを報告します。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"} 

答えて

1

私はJamesの答えが気に入っていますが、なぜこの問題があるのか​​説明したいと思います。ダブルチェックが失敗する理由は、実際にパスを1回だけチェックすることです。コードの先頭で

、あなたはパスは次の2行

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

変数$pathExistsに存在するかどうかを確認し、この時点で作成され、時間にその時点から結果を格納しています。そのため、コードの後半でエラーが発生した場合は、実際に同じ出力を初めて使用しているため、ダブルチェックが行われます。

パスは存在するかどうかテストし続け、パスが存在しない場合はパスを作成します。あなたは何をすべき

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

は、ここで1つの以上のテストを追加しますが、ドライブがすでに存在している知っているよです。


私はあなたのための余分なテストを追加して、わずかに各ブランチのための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"} 
+0

これは完璧でした!あまりにも長い説明をありがとう! – Adam

2

あなたは、ドライブがマップされた後のチェックを実行する(もし、ネストされた)ififを使用することができます。

また、最初のチェックのロジックを変更して、-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" 
    } 
} 
関連する問題