首页 > 解决方案 > 至少我认为PowerShell没有正确处理参数?

问题描述

我编写了这段代码来格式化闪存驱动器:

[CmdLetBinding()]

Param (
  [Parameter(Mandatory=$True)]
    [String] $DrvLtr,
  [Parameter(Mandatory=$False)]
    [ ValidateSet("NTFS","ReFS","exFAT",
                  "FAT32","FAT")]
    [String] $FileSys = "NTFS" ,
  [Parameter(Mandatory=$False)]
    [Switch] $TestIt
)

$FVArgs = @{DriveLetter = $DrvLtr
            FileSystem  = $FileSys
            Force       = $True
            Full        = $True
            Confirm     = $True
            WhatIf      = $($TestIt.isPresent)
           }

 Format-Volume @FVArgs

当我按如下方式调用代码时:

PS> .\Dev-New-Format-FlashDrive.ps1 -TestIt -DrvLtr x

它的运行就好像 Format-Volume 的 -TestIt(-WhatIf 的值)和 -Confirm 参数不存在一样。处理 Format-Volume 并格式化驱动器。

我在 Volume-Format 行使用断点运行代码,并使用以下结果测试了参数:

PS> .\Dev-New-Format-FlashDrive.ps1 -TestIt -DrvLtr x

Hit Line breakpoint on 'G:\BEKDocs\Scripts\Dev-New-Format-FlashDrive.ps1:24'
PS> $FVArgs

Name                           Value                                           
----                           -----                                           
FileSystem                     NTFS                                            
Force                          True                                            
Confirm                        True                                            
WhatIf                         True                                            
DriveLetter                    x                                               
Full                           True                                            

PS> 

想法?

编辑:Theo,回应您的帖子:

Test Results:

PS> .\Test\Test-Format-FlashDriveOrdered.ps1 -DrvLtr "X" -FileSys FAT32 -TestIt

DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatu
                                                               s               
----------- ------------ -------------- --------- ------------ ----------------
X                        FAT32          Removable Healthy      OK              

PS> .\Test\Test-Format-FlashDriveMovedSwitches.ps1 -DrvLtr "X" -FileSys FAT32 -TestIt

DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatu
                                                               s               
----------- ------------ -------------- --------- ------------ ----------------
X                        FAT32          Removable Healthy      OK              

# Force set to False on all the following...

# WhatIf Removed
PS> .\Test\Test-Format-FlashDrive.ps1 -DrvLtr "X" -FileSys FAT32 -TestIt1
DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatu
                                                               s               
----------- ------------ -------------- --------- ------------ ----------------
X                        FAT32          Removable Healthy      OK              


# Whatif Replaced Confirm Removed
PS> .\Test\Test-Format-FlashDrive.ps1 -DrvLtr "X" -FileSys FAT32 -TestIt

DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatu
                                                               s               
----------- ------------ -------------- --------- ------------ ----------------
X                        FAT32          Removable Healthy      OK              

标签: powershell

解决方案


这不是一个答案,我只是想了解更多,所以请您告诉我们在以下情况下会发生什么:

关于确认开关

默认情况下,Shell 会自动将 Confirm 开关应用于具有以下动词的 cmdlet:

清除、禁用、卸载、移动、删除、停止、暂停、卸载

Format似乎不在其中。
该页面还指出“如果要手动将确认开关应用于命令,请在命令末尾包含确认开关”

WhatIf开关的情况几乎相同:再次,“当您与 WhatIf 开关一起运行命令时,您将 WhatIf 开关放在命令的末尾

对我来说,这可能意味着您不能在飞溅的哈希表中使用这些开关(??)

出于好奇,如果你尝试会发生什么

[CmdLetBinding()]

Param (
  [Parameter(Mandatory=$True)]
    [String] $DrvLtr,
  [Parameter(Mandatory=$False)]
    [ ValidateSet("NTFS","ReFS","exFAT","FAT32","FAT")]
    [String] $FileSys = "NTFS" ,
  [Parameter(Mandatory=$False)]
    [Switch] $TestIt
)

# try with an [ordered] hash, so the Confirm and WhatIf switches are last
$FVArgs = [ordered]@{
    DriveLetter = $DrvLtr
    FileSystem  = $FileSys
    Force       = $True
    Full        = $True
    Confirm     = $True
    WhatIf      = $($TestIt.isPresent)
}

Format-Volume @FVArgs

如果您将它们从飞溅的哈希表中取出会发生什么,例如:

[CmdLetBinding()]

Param (
  [Parameter(Mandatory=$True)]
    [String] $DrvLtr,
  [Parameter(Mandatory=$False)]
    [ ValidateSet("NTFS","ReFS","exFAT","FAT32","FAT")]
    [String] $FileSys = "NTFS" ,
  [Parameter(Mandatory=$False)]
    [Switch] $TestIt
)

$FVArgs = @{
    DriveLetter = $DrvLtr
    FileSystem  = $FileSys
    Force       = $True
    Full        = $True
}

Format-Volume @FVArgs -Confirm -WhatIf:($TestIt.isPresent)

推荐阅读