2

「スイッチ」で、評価している変数を変更し、それを取得して一致を変更する方法はありますか?

$var = "a"
switch ($var){

    "a" {Write-Host "1st match for 'a'"}
    "b" {Write-Host "1st match for 'b'"}
    "a" {Write-Host "2nd match for 'a'"; $var = "b" ; continue}
    "b" {Write-Host "2st match for 'b'"}
}

上記を一致させることができれば幸いです:

'a' の 1番目の一致 'a
' の
2 番目の一致 'b'の 2 番目の一致

$Destination = "vmstores:\vcsa@443\Training\Local-B\David" #is a param of my function, which could be a bunch of different types of object.

$DestinationType = $Destination.GetType().Name

    switch ($DestinationType){
        "String" {
            if ((Test-Path $Destination) -eq $true){
                if ((Get-Item $Destination).GetType().Name -eq "DatastoreFolderImpl"){
                    $DestinationType = "DatastoreFolderImpl"
                    if ((Test-Path $Destination.Insert($Destination.Length,"\").Insert(($Destination.Length)+1,$SourceVMXShort)) -eq $true){
                    Write-Warning "Destination File exists..."
                    $DestinationExists = $true
                    }
                }
                elseif ((Get-Item $Destination).GetType().Name -eq "DatastoreFileImpl"){
                    $DestinationType = "DatastoreFileImpl"
                    Write-Warning "Destination File exists..."
                    $DestinationExists = $true
                }
            }
             ; continue
        }
        "DirectoryInfo" {
            if ((Test-Path $Destination.Insert($Destination.Length,"\").Insert(($Destination.Length)+1,$SourceVMXShort)) -eq $true){
                Write-Warning "Destination File exists..."
                $DestinationExists = $true
            }
            ; break
        }
        "FileInfo" {
            if ((Test-Path $Destination) -eq $true){
                Write-Warning "Destination File exists..."
                $DestinationExists = $true
            }
            ; break
        }
        "DatastoreFileImpl" {
            if ((Test-Path $Destination) -eq $true){
                Write-Warning "Destination File exists..."
                $DestinationExists = $true
            }
            ; break
        }
        "DatastoreFolderImpl" {
            if ((Test-Path $Destination.Insert($Destination.Length,"\").Insert(($Destination.Length)+1,$SourceVMXShort)) -eq $true){
                Write-Warning "Destination File exists..."
                $DestinationExists = $true
            }
            ; break
        }
        "NasDatastoreImpl" {
            New-PSDrive -Name "DestMount" -Root \ -PSProvider VimDatastore -Datastore $Destination | Out-Null
            if ((Test-Path ("DestMount:").insert(10,"\").Insert(11,$SourceVMXShort)) -eq $true){
                Write-Warning "Destination File exists..."
                $DestinationExists = $true
            }
            $Destination = ("DestMount:").insert(10,"\")
            ; break
        }
        "VMFSDatastoreImpl" {
            New-PSDrive -Name "DestMount" -Root \ -PSProvider VimDatastore -Datastore $Destination | Out-Null
            if ((Test-Path ("DestMount:").insert(10,"\").Insert(11,$SourceVMXShort)) -eq $true){
                Write-Warning "Destination File exists..."
                $DestinationExists = $true
            }
            $Destination = ("DestMount:").insert(10,"\")
            ; break
        }

    }

ご覧のとおり、$DestinationType を更新して、余分な 'if' ではなく、他のスイッチ ブロックでステートメントを再利用できれば、より洗練されたものになります。

4

2 に答える 2

0

switchチェック中にステートメント変数を変更できるとは思いませんが、ネストされたswitchステートメントを実行できます。このコードは、要求された出力を提供します。

$var = "a"
switch ($var){
    "a" {Write-Host "1st match for 'a'"}
    "b" {Write-Host "1st match for 'b'"}
    "a" {Write-Host "2nd match for 'a'"
            $var = "b" 
            switch ($var) {
                "b" {Write-Host "2st match for 'b'"}
            } #End sub-switch
        } #End "A" check
} #End Primary switch

さて、あなたの全体的な目標が何であるかわかりません。関数などでこれを行うより良い方法があるかもしれません。

更新された質問とコメントの後に編集:

更新されたコードを見ると、 を設定する if ステートメントを引き出すことができます$DestinationExists = $trueif一度だけ表示されるように、ステートメントを再編成できる場合があります。残念ながら、switch ステートメントで変数 mid-switch を変更する方法はありません。あなたのコメントから、型を指示する追加のパラメーターを追加できるので、型に基づいて 1 つの大きな switch ステートメントを使用できます。このようなもの:

switch ($DataType) {
    "String" {<#Things to do if string#>}
    "OtherTypes" {<#Continue like this#>}
}#End Switch ($DataType)

その時点で、私はパラメーター セットを使い始めると思います。パラメータセットについて説明しているブログはこちら

于 2012-10-24T22:05:01.223 に答える