选择不存在的属性时没有错误

Ada*_*ski 3 powershell powershell-4.0 select-object

我希望PowerShell在尝试选择不存在的属性时抛出错误,但是我得到了空列作为输出。例:

$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
Run Code Online (Sandbox Code Playgroud)

我编写了一个脚本,该脚本通过导入了多个文本文件Import-Csv,但是这些文件中的标题可能会更改,最后我将空列加载到系统中。

编辑:这就是我检查标题是否匹配的方式:

$csv = Import-Csv -Delimiter ';' -Path $file.FullName 
$FileHeaders = @(($csv | Get-Member -MemberType NoteProperty).Name) 
if (Compare-Object $ProperHeaders $FileHeaders) {'err'} else {'ok'}
Run Code Online (Sandbox Code Playgroud)

我知道这就是PowerShell的工作方式,但是Set-StrictMode正如@Matt所提到的,文档确实对我有点误导。我只希望Select-Object有某种“ -NoNewImplicitProps”或“ -ReadOnlyPipeline”开关可以为我完成工作:)。感谢您的回答。

Mat*_*att 5

您实际上正在使用某些人称为功能的功能。这是Add-Member在所有数组成员上使用添加空列的简单表示。

在的情况下,Import-CSV你在这种情况下,做的是检查属性名称Select在那里你给他们打电话。

$data = Import-csv C:\Temp\file.csv 
$props = $data | Get-member -MemberType 'NoteProperty'  | Select-Object -ExpandProperty Name
Run Code Online (Sandbox Code Playgroud)

我可以看到文档中的内容有些误导Set-StrictMode

禁止引用对象的不存在的属性。

但是在这种情况下,您不是要获取属性引用,而是要使用Select-Objectcmdlet 的功能。以下内容虽然会产生错误

PS C:\Users\mcameron> Set-StrictMode -Version 'Latest'
(Get-Process *ex*).Bagels
Run Code Online (Sandbox Code Playgroud)
$data = Import-csv C:\Temp\file.csv 
$props = $data | Get-member -MemberType 'NoteProperty'  | Select-Object -ExpandProperty Name
Run Code Online (Sandbox Code Playgroud)