powershell - 至少我认为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
解决方案
这不是一个答案,我只是想了解更多,所以请您告诉我们在以下情况下会发生什么:
关于确认开关
默认情况下,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)
推荐阅读
- php - elseif 不能按预期在 php 中工作
- javascript - 在可拖动的div下获取文本(jquery)
- javascript - 做什么和意思是?
- tensorflow - 冻结 mobilenet_v2 (freeze_graph.py)
- javascript - 如何在 JS 中使用三元运算符进行返回?
- apache - 关闭centos 6时重新启动Apache
- tensorflow - Tensorflow Data API:在 CPU 上训练时预取?
- wso2dss - WSO2 DSS - odata 过滤器不起作用
- android - 如何从 Recyclarview Adapter 等 Android 应用程序中的任何位置获取运行时权限
- vue.js - Nuxt 生成不关闭标签