在电源外壳中没有前两三个字母的字符串

时间:2016-09-25 15:38:15

标签: powershell powershell-v2.0

我想从一行读取一个字符串。这条线是

 ERROR: file'C:\Program Files (x86)\movies\action\Theincrediblehulk.mp3' is missing

我只想要

 Theincrediblehulk.mp3 

我用来获取该字符串的代码是

Select-String tt.txt -pattern [regex]"[A-Za-z]+\.mp3" -AllMatches | % { $_.Matches } | % { $_.Value }

但它正在给我输出

crediblehulk.mp3

缺少前两三个字。 请建议一个更好的方法来解决这个问题。我使用[A-Za-z]因为名字是动态的。

2 个答案:

答案 0 :(得分:3)

首先在引号之间抓取所有

$Filepaths = Select-String tt.txt -pattern "'([^']+)'" -AllMatches | % { $_.Matches } | % { $_.Groups[1].Value }

现在您可以使用Split-Path -Leaf来获取文件名:

$Filenames = $Filepaths |Split-Path -Leaf

Path.GetFileName()

$Filenames = $Filepaths |% { [System.IO.Path]::GetFileName($_) }

答案 1 :(得分:1)

Mathias R. Jessen的答案是一个更好的解决方案,但是这个答案解释了为什么原始代码没有按预期工作。

我假设你的[regex]开头,你试图告诉powershell将你的字符串转换为正则表达式对象。但是,powershell实际上将你的论点解释为

-pattern '[regex]"[A-Za-z]+\.mp3"'

如果您确实希望将字符串显式视为正则表达式对象,则需要将值包装在括号中

-pattern ([regex]"[A-Za-z]+\.mp3")

虽然没有必要使用正则表达式,但单独使用字符串就足够了。

-pattern '[A-Za-z]+\.mp3'