2017-03-31 10 views
0

私はsysの管理者がフォルダレベルまでドリルダウンすることなくACLを変更できるようにスクリプトを作成しています。これまでのところ、私の最初のスイッチでの最初の "If..Else"ステートメントを除いて、すべてが意図したとおりに実行されています。それは完全にスキップされ、アカウント名を求めるように移動し、私は理由を把握できません。なぜ "If Else"ステートメントがスキップされるのですか?

enter image description here

誰がどんな考えを持っていますか?

$account  = $null 
$accesslevel = $null 
$accesstype = $null 
$acl = $null 

$title = Write-Host "Modify ACL" -ForegroundColor Green 
$message = Write-Host "Select the action to initiate:" -ForegroundColor Cyan 

$add   = New-Object System.Management.Automation.Host.ChoiceDescription "&Add Permissions", "Add Permissions" 
$remove  = New-Object System.Management.Automation.Host.ChoiceDescription "&Remove Permissions", "Remove Permissions" 

$options = [System.Management.Automation.Host.ChoiceDescription[]]($add, $remove) 

$selectAction = $Host.UI.PromptForChoice($title, $message, $options, 0) 
switch($selectAction){ 
    0{      
     $pathPrompt = Write-Host "Please enter path to file/folder:" -ForegroundColor Green 
     $path  = Read-Host 
     $test  = Test-Path $path | Out-Null 

     if($test -eq $false){ 
      Write-Host "ERROR! Invalid Path!" -ForegroundColor Red 
      Break     
     }Else{ 
      Write-Host "Getting ACL on`r"$path -ForegroundColor Green 
      $acl = get-acl $path 
     } 

     if($account -eq $null){ 
      Write-Host "Enter Account (ex. Domain\Account)" -ForegroundColor Green 
      $account = Read-Host 
      } 

     $title2 = Write-Host "Permission Levels" -ForegroundColor Green 
     $message2 = Write-Host "Select the appropriate permissions to apply:" -ForegroundColor Cyan 

     $fullControl = New-Object System.Management.Automation.Host.ChoiceDescription "&FullControl", "FullControl" 
     $modify  = New-Object System.Management.Automation.Host.ChoiceDescription "&Modify", "Modify" 
     $readExecute = New-Object System.Management.Automation.Host.ChoiceDescription "&ReadAndExecute", "ReadAndExecute" 
     $read  = New-Object System.Management.Automation.Host.ChoiceDescription "&Read", "Read" 
     $write  = New-Object System.Management.Automation.Host.ChoiceDescription "&Write", "Write" 
     $readWrite = New-Object System.Management.Automation.Host.ChoiceDescription "&Read, Write", "Read, Write" 
     $list  = New-Object System.Management.Automation.Host.ChoiceDescription "&List", "List" 

     $options2 = [System.Management.Automation.Host.ChoiceDescription[]]($fullControl, $modify, $readExecute, $read, $write, $readWrite, $list) 

     do{ 
      $selectAction2 = $Host.UI.PromptForChoice($title2, $message2, $options2, 1) 
       switch($selectAction2){ 
        0{$accesslevel = 'FullControl'} 
        1{$accesslevel = 'Modify'} 
        2{$accesslevel = 'ReadandExecute'} 
        3{$accesslevel = 'Read'} 
        4{$accesslevel = 'Write'} 
        5{$accesslevel = 'Read, Write'} 
        6{$accesslevel = 'List'} 
       } 
     }Until($accesslevel -ne $null) 

     $title3 = Write-Host "Access Type" -ForegroundColor Green 
     $message3 = Write-Host "Select the type of access:" -ForegroundColor Cyan 

     $allow = New-Object System.Management.Automation.Host.ChoiceDescription "&Allow", "Allow" 
     $deny = New-Object System.Management.Automation.Host.ChoiceDescription "&Deny", "Deny" 

     $options3 = [System.Management.Automation.Host.ChoiceDescription[]]($allow, $deny) 

     do{ 
      $selectAction3 = $Host.UI.PromptForChoice($title3, $message3, $options3, 0) 
       switch($selectAction3){ 
        0{$accesstype = 'Allow'} 
        1{$accesstype = 'Deny'} 
       } 
     }Until($accesstype -ne $null) 

     Write-Host "Setting ACL on"$path -ForegroundColor Yellow 

     $arguments = $account, $accesslevel, $accesstype 

     Try{ 
      $accessrule = New-Object System.Security.AccessControl.FileSystemAccessRule $arguments 
       $acl.SetAccessRule($accessrule) 
     }Catch{ 
      Write-Host "Exception thrown : $($error[0].exception.message)" 
     }Finally{ 
      $acl | set-acl $path 
     } 

     Write-Host "ACL settings have been completed." -ForegroundColor Cyan 
    } 
    1{ 
     $pathPrompt 
     $path 
     $test | Out-Null 

     if($test -eq $false){ 
      Write-Host "ERROR! Invalid Path!" -ForegroundColor Red 
      Break     
     }Else{ 
      Write-Host "Getting ACL on`r"$path -ForegroundColor Green 
      $acl = get-acl $path 
     } 
     if($account -eq $null){ 
      $account = Read-Host "Enter Account (ex. Domain\Account)" -ForegroundColor Green 
      } 
    } 
} 
+0

'$ test -eq $ false'なら' break'する必要がありますが、代わりに続行しますか? –

+0

@DavorMlinaricはい、Write-Hostの1つが表示されるはずである場合、次のIf文に移動します。 – T4RH33L

+0

私はこの言語を知らないのですが、if文を終了してから "continue"することができます。多分実行を停止する他の方法があります... 'exit/end switch'か何か... –

答えて

4

あなたif-elseあなたがそれを書いたとして、正常に動作しています。しかし、あなたが書いたものは、あなたが望むものではありません。

最初に:else句のWrite-Hostには、エスケープされた`rを使用しないでください。エスケープされた`nを使用するか、まったく何も使用しません。 は、ラインの開始への復帰を示すが、次のラインへの復帰を示さない。 `nは、行頭への復帰および次行への復帰を示します。上の例で緑色で入力されたパスを繰り返すことは、Write-Hostが実行されているという強い示唆です。あなたがnullのデバイスに結果を送信するのではなく、変数への代入のためのステートメントに戻すことができるようにしているので、

第二に、あなたのTest-Pathは、値を持たないように$testの原因となります。 | Out-Nullを削除します。

+0

@マット - ありがとう - 私はバックティックをエスケープして編集したように見えるようにすることができませんでした(または参照を見つける)ことができませんでした。 –

+0

うん。私はそれを参照する必要があるときはいつも嫌いです。あなたはもっと知っているでしょう。・⭐ – Matt

+0

@JeffZeitlinありがとう!今は完璧に動作しています。 – T4RH33L

関連する問題