我正在尝试使用Powershell(版本4)从Windows上的一组文件中提取文本:
PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | Format-Table
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.这给出了一组很好的MatchInfo对象:
IgnoreCase LineNumber Line Filename Pattern Matches
---------- ---------- ---- -------- ------- -------
True 30 ... file.jsp ... {...}
Run Code Online (Sandbox Code Playgroud)
接下来,我看到捕获是在匹配成员中,所以我把它们拿出来:
PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | ForEach-Object -MemberName Matches | Format-Table
Run Code Online (Sandbox Code Playgroud)
这使:
Groups Success Captures Index Length Value
------ ------- -------- ----- ------ -----
{...} True {...} 49 47 ...
Run Code Online (Sandbox Code Playgroud)
或作为列表| Format-List:
Groups : {matched text, captured group}
Success : True
Captures …Run Code Online (Sandbox Code Playgroud) 尝试执行选择对象,但我似乎无法从键值列表属性返回属性和值。我希望从此参数属性返回 RunStart、Message 和“tableName”3 个属性。
我对此感到太多了:
|Select-Object -Property Parameters,RunStart,Message
Parameters RunStart Message
---------- -------- -------
{[tableName, AHROR012], [schemaName, dbo]...} 11/14/2019 5:39:06 PM Operation on target failed
Run Code Online (Sandbox Code Playgroud)
但当我这样做时,我没有收到 RunStart 或消息:
|Select-Object -ExpandProperty Parameters -Property tableName,RunStart,Message
Key Value
--- -----
tableName AHROR012
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能得到:
Parameters.tableName RunStart Message
---------- -------- -------
AHROR012 11/14/2019 5:39:06 PM Operation on target failed
Run Code Online (Sandbox Code Playgroud)
谢谢!!!
这是我当前的脚本的样子:
$cpu = Get-WmiObject win32_processor | select LoadPercentage
logwrite $cpu #this fuction writes $cpu into a .txt file
Run Code Online (Sandbox Code Playgroud)
该文件的输出为:
@{LoadPercentage=4}
Run Code Online (Sandbox Code Playgroud)
我希望它只是数字,以便我进行计算。
我只是好奇我是否缺少任何文档,或者是否有不同/更好的方法来做到这一点,从而不需要文档。也许我是唯一一个尝试从一组数据中Select-Object选择唯一实例的人。-First X
根据下面的测试,看起来Select-Object与-Unique开关和某种类型的限制器(First、Last、Skip、Index等)一起使用本质上会导致在删除重复项之前应用限制器。这在概念上对我来说没有意义,而且似乎也没有记录在案。
我对这个糟糕的例子表示歉意,但考虑一个包含 20 个项目的数组,每个项目出现两次:
PS > $array = @() ; 1..10 | % { $array += $_ ; $array += $_ }
PS > $array -Join ','
1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10 ##Displaying the array on a single comma separated line
Run Code Online (Sandbox Code Playgroud)
假设有人给了你$array,但你最多只能处理 5 个对象的输入。过滤给你的内容,你可能会想使用Select-Object. 一开始你最终得到了 5 个对象,但是有重复的对象,所以你很快就想了想,只需添加开关-Unique,然后你就会意识到输出仍然不太正确。
PS > ($array | Select-Object -First 5) -Join ','
1,1,2,2,3 ##5 objects as expected, …Run Code Online (Sandbox Code Playgroud) 我希望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”开关可以为我完成工作:)。感谢您的回答。
我有很多时间试图理解为什么这个脚本没有按预期工作。这是一个简单的脚本,我试图在其中导入 CSV,选择我想要的几列,然后导出 CSV 并复制自身。(基本上我们已经归档了数据,由于内存大小限制,我只需要从另一个项目中提取几列数据)。这个脚本非常简单,它显然与它不起作用时造成的挫败感成反比关系......现在最终结果是我最终得到一个空的 csv 而不是一个只包含我选择的列的 csv与选择对象。
$RootPath = "D:\SomeFolder"
$csvFilePaths = Get-ChildItem $RootPath -Recurse -Include *.csv |
ForEach-Object{
Import-CSV $_ |
Select-Object Test_Name, Test_DataName, Device_Model, Device_FW, Data_Avg_ms, Data_StdDev |
Export-Csv $_.FullName -NoType -Force
}
Run Code Online (Sandbox Code Playgroud) 我有一组对象,其中包含id,username,email,current_sign_in_at,identityities等属性.其中Identities属性是具有两个属性的对象数组.这将是对象的json表示:
{
"id": 45,
"name": "Emilio Roche",
"username": "EROCHE",
"state": "active",
"identities": [
{
"provider": "ldapmain",
"extern_uid": "cn=roche\\, emilio,ou=xxxxxxxxxx"
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是列表中的一些元素没有identityities属性.所以,当我这样做时:
Get-Collection | Select-Object id, username -ExpandProperty identities
Run Code Online (Sandbox Code Playgroud)
我只获得具有identities属性的元素.我需要所有实体,有或没有身份属性
使用此代码,我得到了所需的结果:
Get-Service | select Name,Status
Run Code Online (Sandbox Code Playgroud)
但是下面的代码不起作用,你知道为什么吗?我希望用户选择自己的属性选择.我将属性存储在如下所示的变量中.但它不会起作用:
$param = "Name,Status"
Get-Service | select $param
Run Code Online (Sandbox Code Playgroud) Strongly Encouraged Development Guidelinescmdlet 应该为管道中间实现的 PowerShell ,但我怀疑-Last对于Select-Object. 仅仅是因为您无法预先确定最后一个条目。换句话说:您需要等待输入流完成,直到您定义最后一个条目。
为了证明这一点,我写了一个小脚本:
$Data = 1..5 | ForEach-Object {[pscustomobject]@{Index = "$_"}}
$Data | ForEach-Object { Write-Host 'Before' $_.Index; $_ } |
Select-Object -Last 5 | ForEach-Object { Write-Host 'After' $_.Index }
Run Code Online (Sandbox Code Playgroud)
并将其与Select-Object *:
$Data | ForEach-Object { Write-Host 'Before' $_.Index; $_ } |
Select-Object * | ForEach-Object { Write-Host 'After' $_.Index }
Run Code Online (Sandbox Code Playgroud)
结果(右:Select-Object -Last 5,左:)Select-Object *:
-Last 5 *
------- - …Run Code Online (Sandbox Code Playgroud)