我正在尝试使用powershell从channel9下载视频系列,但是我在第一个文件上遇到此错误,我认为它是管道符,但即使使用替换语句也无法正常工作
function Get-Media
{
[CmdletBinding()]
param
(
[Object]
$url,
[Object]
$title,
[Object]
$path
)
$u = New-Object System.Uri($url)
$name = $title
$extension = [System.IO.Path]::GetExtension($u.Segments[-1])
$fileName = $name + $extension
$fileName = $fileName -replace "’", ''
$fileName = $fileName -replace "\?", ''
$fileName = $fileName -replace ":", ''
$fileName = $fileName -replace '/', ''
$fileName = $fileName -replace ",", ''
$fileName = $fileName -replace '"', ''
$fileName = $fileName -replace '|', ''
$fileName = $fileName -replace '\#', ''
$fileName = $fileName -replace '-', ''
$fileName
if (Test-Path($fileName)) {
Write-Host 'Skipping file, already downloaded' -ForegroundColor Yellow
}
else
{
Invoke-WebRequest $url -OutFile (Join-Path -Path $path -ChildPath $fileName)
}
}
function Get-VideosFromFeed
{
[CmdletBinding()]
param
(
[Object]
$feedUrl,
[Object]
$folder,
[Object]
$path
)
$feed=[xml](New-Object System.Net.WebClient).DownloadString($feedUrl)
$downloadPath = (Join-Path -Path $path -ChildPath $folder)
if (Test-Path($downloadPath)) {
Write-Host 'Skipping folder, already exists' -ForegroundColor Yellow
}
else
{
New-Item -Path $downloadPath -ItemType directory -WarningAction SilentlyContinue
}
foreach($i in $feed.rss.channel.item) {
foreach($m in $i.group){
foreach($u in $m.content `
| Where-Object { `
$_.url -like '*mid.mp4' `
} | Select-Object -Property @{Name='url'; Expression = {$_.url}}, `
@{Name='title'; Expression = {$i.title}})
{
Get-Media -url $u.url -title $u.title -path $downloadPath
}
}
}
}
$physicalPath = "D:\Videos\Series"
Get-VideosFromFeed -feedUrl 'https://channel9.msdn.com/Blogs/azurestack/feed/mp4high' -path $physicalPath -folder 'azurestack'
我相信,你应该替换这段奇怪的代码:
$fileName = $fileName -replace "’", ''
$fileName = $fileName -replace "\?", ''
$fileName = $fileName -replace ":", ''
$fileName = $fileName -replace '/', ''
$fileName = $fileName -replace ",", ''
$fileName = $fileName -replace '"', ''
$fileName = $fileName -replace '|', ''
$fileName = $fileName -replace '\#', ''
$fileName = $fileName -replace '-', ''
有了这个:
$fileName = $fileName -replace '(-|#|\||"|,|/|:|â|€|™|\?)', ''
我在严格的代理后面工作,无法测试整个过程,但至少我没有得到“路径中的非法字符”错误。
顺便说一句,你不需要更换所有的东西。根据<>:"/\|?*
,只有theese字符:naming rules。所以更好的正则表达式应该像这样:-replace '\<|\>|:|"|/|\\|\||\?|\*', ''
看起来好像在没有$ Folder或$ Path参数的情况下调用Get-VideosFromFeed。
您可能需要设置一些默认值或在调用函数时将其移入。
试着像这样调用它:
Get-VideosFromFeed -feedUrl 'https://channel9.msdn.com/Blogs/azurestack/feed/mp4high' -folder "Folder" -Path "C:\Path"
这条线没有做任何事情:
$fileName = $fileName -replace '|', ''
-replace的第一个参数是正则表达式。它在$ fileName中找到每个空字符串,并用空字符串替换它。除了浪费一堆CPU周期外,这没有任何影响。
您需要转义正则表达式中的管道字符。
$fileName = $fileName -replace '\|', ''
你也可以试试这个:
$FileName.Split([IO.Path]::GetInvalidFileNameChars()) -join ''
这对我来说似乎很有效:)