选择 non-existing 属性 时没有错误
No error when selecting non-existing property
我希望 PowerShell 在尝试 select non-existing 属性时抛出错误,但我得到的是空列作为输出。示例:
$ErrorActionPreference=[System.Management.Automation.ActionPreference]::Stop;
Set-StrictMode -Version 'Latest'
Get-Process *ex* | Select-Object Id,ProcessName,xxx
Id ProcessName xxx
-- ----------- ---
9084 explorer
11404 procexp
我编写了一个脚本,该脚本通过 Import-Csv
导入多个文本文件,但这些文件中的 headers 可能会更改,我最终会将空列加载到系统中。
编辑:
这就是我检查 headers 是否匹配的方式:
$csv = Import-Csv -Delimiter ';' -Path $file.FullName
$FileHeaders = @(($csv | Get-Member -MemberType NoteProperty).Name)
if (Compare-Object $ProperHeaders $FileHeaders) {'err'} else {'ok'}
我知道这就是 PowerShell 的工作方式,但是 Set-StrictMode
文档确实对我有点误导,正如@Matt 提到的那样。我只希望 Select-Object
有某种“-NoNewImplicitProps”或“-ReadOnlyPipeline”开关可以为我完成这项工作:)。感谢您的回答。
您实际上是在对所有数组成员使用 some people would call a feature. That is a simpler rendition of using Add-Member
来添加一个空列。
在 Import-CSV
的情况下,您在这种情况下所做的是检查 属性 名称 在 之前 Select
您称呼它们的地方.
$data = Import-csv C:\Temp\file.csv
$props = $data | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty Name
我看文档有点misleading when it says for Set-StrictMode
:
Prohibits references to non-existent properties of an object.
但在这种情况下,您并不是要获取 属性 引用,而是使用 Select-Object
cmdlet 的函数。尽管以下内容会产生错误
PS C:\Users\mcameron> Set-StrictMode -Version 'Latest'
(Get-Process *ex*).Bagels
The property 'Bagels' cannot be found on this object. Verify that the property exists.
At line:2 char:1
+ (Get-Process *ex*).Bagels
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], PropertyNotFoundException
+ FullyQualifiedErrorId : PropertyNotFoundStrict
PowerShell 将不存在的属性扩展到 $null
的行为符合设计。 AFAICS 你唯一能做的就是明确检查所有属性是否存在:
$props = 'Id', 'ProcessName', 'xxx'
$p = Get-Process *ex*
$missing = $p | Get-Member -Type *property |
Select-Object -Expand Name |
Compare-Object -Reference $props |
Where-Object { $_.SideIndicator -eq '<=' } |
Select-Object -Expand InputObject
if ($missing) {
throw "missing property $missing."
} else {
$p | Select-Object $props
}
当然,您可以将其包装在自定义函数中:
function Select-ObjectStrict {
[CmdletBinding()]
Param(
[Parameter(
Position=0,
Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true
)]$InputObject,
[Parameter(
Position=1,
Mandatory=$true
)][string[]]$Property
)
Process {
$missing = $InputObject | Get-Member -Type *property |
Select-Object -Expand Name |
Compare-Object -Reference $Property |
Where-Object { $_.SideIndicator -eq '<=' } |
Select-Object -Expand InputObject
if ($missing) {
throw "missing property $missing."
} else {
$InputObject | Select-Object $Property
}
}
}
所以它可以这样使用:
Get-Process *ex* | Select-ObjectStrict -Property 'Id', 'ProcessName', 'xxx'
像这样...?
$props = 'Id','ProcessName','xxx'
$availableProps = Get-Process *ex*|Get-Member -MemberType Properties | Select -ExpandProperty Name
$missingProps = $props | Where-Object {-not ($availableProps -contains $_)}
if ($missingProps) {
Write-Error "invalid property(s) $missingProps"
throw { [System.Management.Automation.PropertyNotFoundException] }
}
Get-Process *ex* | Select-Object $props
如果你想在选择不存在的时候收到错误消息属性
使用:
Set-StrictMode -Version Latest<br>
$Global:ErrorActionPreference = 'Stop'<br>
我希望 PowerShell 在尝试 select non-existing 属性时抛出错误,但我得到的是空列作为输出。示例:
$ErrorActionPreference=[System.Management.Automation.ActionPreference]::Stop;
Set-StrictMode -Version 'Latest'
Get-Process *ex* | Select-Object Id,ProcessName,xxx
Id ProcessName xxx
-- ----------- ---
9084 explorer
11404 procexp
我编写了一个脚本,该脚本通过 Import-Csv
导入多个文本文件,但这些文件中的 headers 可能会更改,我最终会将空列加载到系统中。
编辑: 这就是我检查 headers 是否匹配的方式:
$csv = Import-Csv -Delimiter ';' -Path $file.FullName
$FileHeaders = @(($csv | Get-Member -MemberType NoteProperty).Name)
if (Compare-Object $ProperHeaders $FileHeaders) {'err'} else {'ok'}
我知道这就是 PowerShell 的工作方式,但是 Set-StrictMode
文档确实对我有点误导,正如@Matt 提到的那样。我只希望 Select-Object
有某种“-NoNewImplicitProps”或“-ReadOnlyPipeline”开关可以为我完成这项工作:)。感谢您的回答。
您实际上是在对所有数组成员使用 some people would call a feature. That is a simpler rendition of using Add-Member
来添加一个空列。
在 Import-CSV
的情况下,您在这种情况下所做的是检查 属性 名称 在 之前 Select
您称呼它们的地方.
$data = Import-csv C:\Temp\file.csv
$props = $data | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty Name
我看文档有点misleading when it says for Set-StrictMode
:
Prohibits references to non-existent properties of an object.
但在这种情况下,您并不是要获取 属性 引用,而是使用 Select-Object
cmdlet 的函数。尽管以下内容会产生错误
PS C:\Users\mcameron> Set-StrictMode -Version 'Latest'
(Get-Process *ex*).Bagels
The property 'Bagels' cannot be found on this object. Verify that the property exists.
At line:2 char:1
+ (Get-Process *ex*).Bagels
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], PropertyNotFoundException
+ FullyQualifiedErrorId : PropertyNotFoundStrict
PowerShell 将不存在的属性扩展到 $null
的行为符合设计。 AFAICS 你唯一能做的就是明确检查所有属性是否存在:
$props = 'Id', 'ProcessName', 'xxx'
$p = Get-Process *ex*
$missing = $p | Get-Member -Type *property |
Select-Object -Expand Name |
Compare-Object -Reference $props |
Where-Object { $_.SideIndicator -eq '<=' } |
Select-Object -Expand InputObject
if ($missing) {
throw "missing property $missing."
} else {
$p | Select-Object $props
}
当然,您可以将其包装在自定义函数中:
function Select-ObjectStrict {
[CmdletBinding()]
Param(
[Parameter(
Position=0,
Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true
)]$InputObject,
[Parameter(
Position=1,
Mandatory=$true
)][string[]]$Property
)
Process {
$missing = $InputObject | Get-Member -Type *property |
Select-Object -Expand Name |
Compare-Object -Reference $Property |
Where-Object { $_.SideIndicator -eq '<=' } |
Select-Object -Expand InputObject
if ($missing) {
throw "missing property $missing."
} else {
$InputObject | Select-Object $Property
}
}
}
所以它可以这样使用:
Get-Process *ex* | Select-ObjectStrict -Property 'Id', 'ProcessName', 'xxx'
像这样...?
$props = 'Id','ProcessName','xxx'
$availableProps = Get-Process *ex*|Get-Member -MemberType Properties | Select -ExpandProperty Name
$missingProps = $props | Where-Object {-not ($availableProps -contains $_)}
if ($missingProps) {
Write-Error "invalid property(s) $missingProps"
throw { [System.Management.Automation.PropertyNotFoundException] }
}
Get-Process *ex* | Select-Object $props
如果你想在选择不存在的时候收到错误消息属性
使用:
Set-StrictMode -Version Latest<br>
$Global:ErrorActionPreference = 'Stop'<br>