从ps脚本中的文件中检索文本

时间:2016-05-17 17:25:47

标签: powershell scripting

我有一个包含以下数据的文本文件:

test|wdthe$muce

check|muce6um#%

如何检查test之类的特定字符串,并将|符号后面的文本检索到PowerShell脚本中的变量? 并且, 如果假设有变量$from=test@abc.com以及如何通过在“@”之前拆分文本来搜索文件?

3 个答案:

答案 0 :(得分:1)

这可能是一种可能的解决方案

$filecontents = @'
test|wdthe$muce

check|muce6um#%
'@.split("`n")

# instead of the above, you would use this with the path of the file
# $filecontents = get-content 'c:\temp\file.txt'

$hash = @{}
$filecontents | ? {$_ -notmatch '^(?:\s+)?$'} | % {
    $split = $_.Split('|')
    $hash.Add($split[0], $split[1])
}
$result = [pscustomobject]$hash

$result

# and to get just what is inside 'test'
$result.test

*注意:这可能仅在文件中每行只有一行时才有效。如果您收到错误,请尝试使用其他方法

$search = 'test'
$filecontents | ? {$_ -match "^$search\|"} | % {
    $_.split('|')[1]
}

答案 1 :(得分:0)

首先,您需要阅读文件中的文字。

$content = Get-Content "c:\temp\myfile.txt"

然后你想要抓住每个匹配线的后管部分。

$postPipePortion = $content | Foreach-Object {$_.Substring($_.IndexOf("|") + 1)}

因为它是PowerShell,你也可以将它连接起来而不是使用变量:

Get-Content "C:\temp\myfile.txt" | Foreach-Object {$_.Substring($_.IndexOf("|") + 1)}

以上假设您碰巧知道每一行都包含一个|字符。如果不是这种情况,则只需选择具有该字符的行,如下所示:

Get-Content "C:\temp\myfile.txt" | Select-String "|" | Foreach-Object {$_.Line.Substring($_.Line.IndexOf("|") + 1)}

(您现在需要使用$_.Line而不是$_因为Select-String返回MatchInfo对象而不是字符串。)

希望有所帮助。祝你好运。

答案 2 :(得分:0)

gc input.txt |? {$_ -match '^test'} |% { $_.split('|') | select -Index 1 }

or

sls '^test' -Path input.txt |% { $_.Line.Split('|') | select -Index 1 }

or 

sls '^test' input.txt |% { $_ -split '\|' | select -Ind 1 }

or

(gc input.txt).Where{$_ -match '^test'} -replace '.*\|'

or

# Borrowing @Anthony Stringer's answer shape, but different 
# code, and guessing names for what you're doing:

$users = @{}
Get-Content .\input.txt | ForEach { 
    if ($_ -match "(?<user>.*)\|(?<pwd>.*)") {
        $users[$matches.user]=$matches.pwd 
    }
}
$users = [pscustomobject]$users