Powershell从URL列表中提取域

Powershell从URL列表中提取域,powershell,Powershell,我有一个文本文件中的URL列表 我只想把域名拔出来 运行以下命令: (Get-Content "c:\temp\test.txt") | ForEach-Object {$url = New-Object System.uri $_;$url.Host} > d:\test.txt 它会生成以下错误: New-Object : Exception calling ".ctor" with "1" argument(s): "Invalid URI: The format of the U

我有一个文本文件中的URL列表

我只想把域名拔出来

运行以下命令:

(Get-Content "c:\temp\test.txt") | ForEach-Object {$url = New-Object System.uri $_;$url.Host} > d:\test.txt
它会生成以下错误:

New-Object : Exception calling ".ctor" with "1" argument(s): "Invalid URI: The format of the URI could not be determined."
文本文件就是那个域(而且只是域,而不是域后面的路径)一遍又一遍

你有没有想过我要在哪里胡闹

示例文件:

lrp.mxptint.net
lrpush.apxlv.com
lsa.measure.ly
lsa.measure.ly\lsa.js?1449665894174&meta_keywords=Life%2C%20lifestyle%2C%20fashi‌​on%2C%20beauty%2C%20Vancouver%2C%20British%20Columbia%2C%20family%2C%20relationsh‌​ips%2C%20home%2C%20blogs%2C%20news%2C%20jobs%2C%20content%2C%20pets%2C%20food%2C%‌​20beauty&autofire=true&windowlocation=www.vancouversun.com\life\diversions lsa.measure.ly\lsa.js?1449665960913&meta_keywords=horoscopes&autofire=true&windo‌​wlocation=news.nationalpost.com\category\life

,URI以一个方案开始(通常是协议,例如
http
)。因此,期望字符串以协议开头。例如,
http://www.example.com
。如果传入
www.example.com
等,您将获得
无效URI
异常。

这是一个基于[System.URI]的解决方案

@((Get-Content -Path "C:\temp\text.txt") | ForEach-Object { if ($_.Trim()) { (New-Object -TypeName System.Uri ("http://{0}" -f (($_.Trim()) -replace "\\", "/"))).Host } } ) | Sort-Object -Unique
。。。或者如果你喜欢正则表达式,你应该试试这个

@((Get-Content -Path "C:\temp\text.txt") | ForEach-Object { if ($_ -match "^([\w\.-]*)") { $matches[1] } }) | Sort-Object -Unique
在这两种情况下,结果都是

lrp.mxptint.net
lrpush.apxlv.com
lsa.measure.ly

好的,DJ给出了一个答案,说明了为什么您正在做的事情不起作用,Buxmaniak给出了一个关于如何通过URI对象和正则表达式来做的很好的函数性答案。我只是想发布一个简化版本,适用于您提供的示例

Get-Content "c:\temp\test.txt" | %{[URI]"http://$_"} | Select -Expand Host | Set-Content D:\Test.txt

这将把http://添加到字符串的开头,并将其转换为URI。然后它从每个URI对象展开Host属性,并将其全部保存到您指定的文件中。

您可以共享
test.txt
中包含的内容的示例吗?当然,我在最初的帖子中有它,但它不允许我发布它。lrp.mxptint.net lrpush.apxlv.com lsa.measure.lylsa.measure.ly\lsa.js?1449665894174&meta_关键字=生活%2C%20生活方式%2C%20时尚%2C%20美丽%2C%20温哥华%2C%20不列颠%20哥伦比亚%2C%20家庭%2C%20关系%2C%20家庭%2C%20博客%2C%20新闻%2C%20工作%2C%20内容%2C%20宠物%2C食品%2C%20美丽与自燃=真实与窗口位置=www.vancouversun.com\Life\diversonslsa.measure.ly\lsa.js?1449665960913&meta_keywords=horoscopes&autofire=true&windowlocation=news.nationalpost.com\category\life如果是我,我会查找“regex domain from url”,并将示例转换为powershell的regex语法,即最后一个url无效,因为所有斜杠都是向后的。在您的文本文件中是这样的吗?因此,如果我在每一行的开头添加http://的话(先去掉它,然后再添加回来),应该可以继续了?对于URI代码来说更容易:
GC$file{[URI]“http://$($-替换“^.*/”)}选择-扩展主机
(我剥离并重新添加了'http://',因为他的示例没有,所以这对您的示例和OP都有效。)更简单的正则表达式解决方案:
GC$File-Replace“^.*?:/([^/]*)(/.*),'$1'
它对您的原始示例有效。它对OP的示例不起作用。这样做:
GC$File-Replace“^.*?::\/)?(.+?)(\\.*$\/.*$$)”,“$1”
获取内容不知道参数替换。
(GC$File)-replace…
可能会起作用。嘿,OP问出了什么问题,不是为了一个可行的解决方案…:p