我想从一行读取一个字符串。这条线是
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]因为名字是动态的。
答案 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'