测试路径:路径中的非法字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试路径:路径中的非法字符相关的知识,希望对你有一定的参考价值。

我正在尝试使用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:VideosSeries"

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 ''

这对我来说似乎很有效:)

以上是关于测试路径:路径中的非法字符的主要内容,如果未能解决你的问题,请参考以下文章

下载 CSV 文件时路径错误中的非法字符

JMeter - Java.net.URISyntaxException: 路径中index处的非法字符

System.ArgumentException 路径中的非法字符

ZipFile.ExtractToDirectory "路径中的非法字符"

如何从路径和文件名中删除非法字符?

错误1324 文件夹路径“My pictures”包含非法字符。