Regex 正在验证Powershell中的文件名输入

Regex 正在验证Powershell中的文件名输入,regex,powershell,Regex,Powershell,我想在PowerShell中验证文件名的输入,并检查它是否包含无效字符。我尝试了以下方法,当只输入其中一个字符时,该方法有效,但当给定的字母数字字符串包含这些字符时,该方法似乎不起作用。我相信我没有正确构造正则表达式,什么是验证给定字符串是否包含这些字符的正确方法?提前谢谢 #Validate file name whether it contains invalid characters: \ / : * ? " < > | $filename = "\?filename.txt"

我想在PowerShell中验证文件名的输入,并检查它是否包含无效字符。我尝试了以下方法,当只输入其中一个字符时,该方法有效,但当给定的字母数字字符串包含这些字符时,该方法似乎不起作用。我相信我没有正确构造正则表达式,什么是验证给定字符串是否包含这些字符的正确方法?提前谢谢

#Validate file name whether it contains invalid characters: \ / : * ? " < > |
$filename = "\?filename.txt"
if($filename -match "^[\\\/\:\*\?\<\>\|]*$")
    {Write-Host "$filename contains invalid characters"}
else
    {Write-Host "$filename is valid"}
#验证文件名是否包含无效字符:\/:*?" < > |
$filename=“\?filename.txt”
如果($filename-match“^[\\/\:\*\?\\\\\;]*$”)
{写入主机“$filename包含无效字符”}
其他的
{写入主机“$filename有效”}
我希望在正则表达式模式中使用而不是硬编码字符,然后使用测试文件名是否包含任何无效字符:

function Test-ValidFileName
{
    param([string]$FileName)

    $IndexOfInvalidChar = $FileName.IndexOfAny([System.IO.Path]::GetInvalidFileNameChars())

    # IndexOfAny() returns the value -1 to indicate no such character was found
    if($IndexOfInvalidChar -eq -1)
    {
        return $true
    }
    else
    {
        return $false
    }
}
然后:

$filename = "\?filename.txt"
if(Test-ValidFileName $filename)
{
    Write-Host "$filename is valid"
}
else
{
    Write-Host "$filename contains invalid characters"
}

如果不想定义新函数,可以简化为:

if($filename.IndexOfAny([System.IO.Path]::GetInvalidFileNameChars()) -eq -1)
{
    Write-Host "$filename is valid"
}
else
{
    Write-Host "$filename contains invalid characters"
}
要修复正则表达式,请执行以下操作:


尝试删除将其锚定到字符串末端的
^
$

如果需要,可以创建如下正则表达式模式:
'[{0}]'-f[regex]::Escape([IO.Path]::GetInvalidFileNameChars()-join'')
删除^看起来不错/也行。