2017-11-17 98 views
-2

有益的堆栈溢出社区,名称字符串的两个部分作为使用PowerShell

我与包含的信息,我需要在一个更大的字符串的两件自动报告奏(.txt文档)工作变量。我需要找到一种方法来从每个变量中创建变量,并使用它们传输到另一个命令中。报告淘汰

例子:

B072L8FX9H 2017-11-17 14:49:17 -05:00 2017-11-17 14:49:17 -05:00 D1 volenick amandun      - - 

我需要创建两个变量,一个包含文本的第一位,文件名B072L8FX9H和含有最后一位一个变量,用户名amandun

请注意文件名将始终为10位数字,但用户名长度会有所不同。此外,- -之前的末端空间有所不同。这些不一致使我不愿意使用修剪,但我不反对。

假设我能得到这两个变量,我相信我可以再管他们进入一个foreach声明标记的实际文件

报告手续的其他例子:

B075XR6ZR1 2017-11-17 15:19:22 -05:00 2017-11-17 15:19:22 -05:00 D1 volenick pascalec      - - 

B01C5AVSBW 2017-11-17 15:21:40 -05:00 2017-11-17 15:21:40 -05:00 D1 volenick Gunthorp      - - 

B076FHS4CZ 2017-11-17 15:23:36 -05:00 2017-11-17 15:23:36 -05:00 D1 volenick amandun      - - 

我还没有能构建一个适用于所有不一致情况的修剪命令。也许有更好的方法来提取这些变量。

感谢

编辑 - 这是我们最后使用的解决方案:

+0

我怀疑人们正在向下投票这个问题的一个明显缺乏的努力,自己解决问题。你提到你尝试过修饰的变体 - 详细说明你尝试过的可能会解决问题。也就是说,我可以想象你可能会尝试什么,并且知道Trim是这个特定工作的错误工具 - 所以你不能解决它。你给出了很好的有用输入示例,并明确了你想要输出的内容。就个人而言,我对这个问题没问题。 –

+0

感谢马特,我同意。我已经添加了我们最终要做的一点。再次感谢大家的帮助。 – Garrett

+0

不要忘记接受一个答案 - 也许是最接近你的解决方案。这将阻止人们重新回顾这个问题来尝试回答它。 –

回答

1

这是检索你想要的信息的方式。

$Parse = 'B072L8FX9H 2017-11-17 14:49:17 -05:00 2017-11-17 14:49:17 -05:00 D1 volenick amandun      - - ' 
$Parse = $Parse.Trim() 

$Parse -match '\w+\s+-\s+-$' >$Null #returns $True 

$Username = $Matches[0] -replace '\s+-\s+-' 
$FileName = ($Parse -split '\s')[0] 
+0

我也是从直线上的比赛开始,希望得到的领域也是如此,但是接下来要问的问题是“我怎么也得到时间?”好的答案,但。 –

1

下面是另一种方法,即将所有字段拆分。

$test = @" 
B075XR6ZR1 2017-11-17 15:19:22 -05:00 2017-11-17 15:19:22 -05:00 D1 volenick pascalec      - - 
B075XR6ZR1 2017-11-17 15:19:22 -05:00 2017-11-17 15:19:22 -05:00 D1 volenick pascalec      - - 
B01C5AVSBW 2017-11-17 15:21:40 -05:00 2017-11-17 15:21:40 -05:00 D1 volenick Gunthorp      - - 
B076FHS4CZ 2017-11-17 15:23:36 -05:00 2017-11-17 15:23:36 -05:00 D1 volenick amandun      - - 
"@ 

# Depending on how you take your input, splitting the lines can be more straight forward. 
# This just splits lines by the - - at the end of each line, ignoring how 
# much whitespace is at the end of the line. 
# Get-Content from a file would automatically split the lines. 
$lines = $test -split "-\s*-\s*" 

foreach($line in $lines) 
{ 
    # split each field of the data based on contiguous whitespace. 
    # this will fail if you have whitespace in a name or file, for example. 
    $fields = $line -split "\s+" 
    Write-Output "$($fields[0]) $($fields[9])" 
} 

随着输出:

B075XR6ZR1 pascalec 
B075XR6ZR1 pascalec 
B01C5AVSBW Gunthorp 
B076FHS4CZ amandun