Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell “先搜索”;x";一行中的字符数,并输出整行_Powershell_Powershell 2.0 - Fatal编程技术网

Powershell “先搜索”;x";一行中的字符数,并输出整行

Powershell “先搜索”;x";一行中的字符数,并输出整行,powershell,powershell-2.0,Powershell,Powershell 2.0,我有一个文本文件,可以包含多达1000行以下格式的数据: 14410:3012669|EU14410|20/01/2017||||1|6|4|OUT FROM UNDER||22/02/2017 04:01:47|22/02/2017 21:19:52 14:3012670|EU016271751|20/01/2017||||2|6|4|BLOCK BET|\\acis-prod\Pictures\Entry\EU01627.jpg|22/02/2017 04:02:02|22/02/2017

我有一个文本文件,可以包含多达1000行以下格式的数据:

14410:3012669|EU14410|20/01/2017||||1|6|4|OUT FROM UNDER||22/02/2017 04:01:47|22/02/2017 21:19:52
14:3012670|EU016271751|20/01/2017||||2|6|4|BLOCK BET|\\acis-prod\Pictures\Entry\EU01627.jpg|22/02/2017 04:02:02|22/02/2017 21:19:52
301111:3012671|EU016275|20/01/2017||||2|6|4|VITAE MEDICAL CLINIC|\\tm-prod\Pictures\Entry\EU01.jpg|22/02/2017 04:02:11|22/02/2017 21:19:53
每行将以以下格式开始

"set of characters up to max of 8":"set of characters unlimited max"
我只想在第一个冒号之前搜索字符。这些字符最多可包含8个字符。(希望在上面的示例中可以很好地显示)我正在尝试搜索这些第一个字符,直到每行的“:”,以查看它是否包含字符串,并返回整行。powershell还是新手,所以我只尝试了一个简单的选择:

$path = "C:\Users\ME\Desktop\acsep22\acsnic-20170222_233324.done"
Get-ChildItem $path -recurse | Select-String -pattern ("14410","3011981","3011982",) | out-file $logfile |format-list 
这是可行的——但我没有考虑到字符串也可能在同一行中出现两次(尽管与前7个字符无关)

例如:

14410:3012669|EU14410|
包含14410两次,它们的重要性无关,我只想根据第一个数字搜索并返回

有人能帮我实现这一点吗?或者有人能给我指点一下有帮助的cmdlet吗

我尝试过各种在线搜索(以及通过Microsoft online资源),但很多搜索结果更多的是“返回前X个字符数”,而不是“仅使用前X个字符数和返回行搜索”


您可以使用一个简单的
Where Object
过滤器来检查
前面的字符串是否是您期望的字符串之一:

$strings = '14410','3011981','3011982'
Get-Content $path |Where-Object {$strings -contains ($_ -split ':')[0]}
这可能是PowerShell最惯用的方法


如果要使用
选择字符串
,则必须构造一个正则表达式模式,该模式将匹配以其中一个字符串开头的字符串,然后是冒号:

$strings = '14410','3011981','3011982'
$pattern = '^(?:{0}):' -f ($strings -join '|') # pattern is now '^(?:14410|3011981|3011982):' 
Select-String -Path $path -Pattern $pattern 
如果您只想从输出中获取裸字符串本身,请从
Select string
返回的对象中获取
Line
属性:

Select-String -Path $path -Pattern $pattern |Select-Object -Expand Line

上面的模式使用非捕获组
(?:模式在这里)
来匹配任何一个字符串,在字符串的
^
开头,后跟


这两种解决方案都适用于任意数量的字符串

您可以使用一个简单的
Where Object
过滤器来检查
前面的字符串是否是您期望的字符串之一:

$strings = '14410','3011981','3011982'
Get-Content $path |Where-Object {$strings -contains ($_ -split ':')[0]}
这可能是PowerShell最惯用的方法


如果要使用
选择字符串
,则必须构造一个正则表达式模式,该模式将匹配以其中一个字符串开头的字符串,然后是冒号:

$strings = '14410','3011981','3011982'
$pattern = '^(?:{0}):' -f ($strings -join '|') # pattern is now '^(?:14410|3011981|3011982):' 
Select-String -Path $path -Pattern $pattern 
如果您只想从输出中获取裸字符串本身,请从
Select string
返回的对象中获取
Line
属性:

Select-String -Path $path -Pattern $pattern |Select-Object -Expand Line

上面的模式使用非捕获组
(?:模式在这里)
来匹配任何一个字符串,在字符串的
^
开头,后跟



这两种解决方案都可以处理任意数量的字符串

@wOxxOm-queryent没有指定模式总是从字符串的开头开始;只有在前7个字符内才会出现。我认为querent需要提供一个更好的示例,说明他正在搜索的内容以及他希望看到的结果。@wOxxOm谢谢你,我现在就开始:)@JeffZeitlin我已经编辑了我的帖子。希望能更清楚一点now@Nighthawkz-因此,在每种情况下,您都希望将字符串匹配到第一个冒号,并在第一个冒号之前搜索整个字符串?更简洁地说:是否希望搜索“30”以匹配以“130:”、“1300:”和“307:”开头的行?@wOxxOm-querynt不指定模式始终从字符串的开头开始;只有在前7个字符内才会出现。我认为querent需要提供一个更好的示例,说明他正在搜索的内容以及他希望看到的结果。@wOxxOm谢谢你,我现在就开始:)@JeffZeitlin我已经编辑了我的帖子。希望能更清楚一点now@Nighthawkz-因此,在每种情况下,您都希望将字符串匹配到第一个冒号,并在第一个冒号之前搜索整个字符串?更简洁地说:是否希望搜索“30”以匹配以“130:”、“1300:”和“307:”开头的行?
Where Object
解决方案似乎与查询对象的意图匹配;使用
-split
和数组下标是一种非常好且优雅的方法。@MathiasR.Jessen谢谢您!我遇到了一个问题。即使我尝试搜索一条我知道存在的线,它也不会收回任何东西。两种方法都试过了。在ISE窗口中运行它以查看,它似乎在每一行中运行,如下所示:C:\Users\LCIAV\Desktop\acsepto22\acsmrk-20170222_230159。完成:4744:1645614 | EU005936547 |(我不知道它会在搜索条件中包含路径)我的问题完全变了,我一开始并没有寻找什么,但是中间和中间:和|。感谢您的回答,它确实回答了我的问题(不正确!)如果您使用第二种方法,
Select String
将返回一个
MatchInfo
对象-如果您只需要字符串本身,请抓取
属性(将更新答案)@杰森整理出了这条路,现在它把所有的东西都拉回来了。尝试使用
“^(?:{0}):”
类似于删除^。没有骰子。从技术上讲,它仍然通过路径名进行搜索吗?因为我想要的ID实际上以粗体“done:307:*273499**| UK00002133376 |”而不是开头。我还使用第二个答案创建了一个包含两行内容的文件,如
1 | 123
2 | 123
,但它仍然会将两行内容都拉回。我认为这个评论是一个单独的问题,所以我会提出一个新问题,确保它尽可能准确possible@Nighthawkz是的,这听起来像是一个单独的问题-请确保您发布的输入样本与新qThe
Where Object
solution应用程序中的输入样本完全相同