Powershell 测试路径-使用通配符有效

Powershell 测试路径-使用通配符有效,powershell,powershell-2.0,Powershell,Powershell 2.0,我试图验证路径,以便提供有意义的错误日志记录,但我遇到了通配符问题。 除非其中有文件夹和内容,否则返回False,但应返回True Test-Path -isValid -path:"C:\Somefolder\*" 像这样是行不通的,因为-literalPath不解释通配符 Test-Path -isValid -literalPath:"C:\Somefolder\*" 我的感觉是我必须测试通配符,如果在父文件夹中找到testpath-isValid。但随后我遇到了-的问题,比如,因为我

我试图验证路径,以便提供有意义的错误日志记录,但我遇到了通配符问题。 除非其中有文件夹和内容,否则返回False,但应返回True

Test-Path -isValid -path:"C:\Somefolder\*"
像这样是行不通的,因为-literalPath不解释通配符

Test-Path -isValid -literalPath:"C:\Somefolder\*"
我的感觉是我必须测试通配符,如果在父文件夹中找到
testpath-isValid
。但随后我遇到了
-的问题,比如
,因为我不能真正测试像*.EXT这样的条件。这让我觉得唯一真正的答案是正则表达式,但这感觉像是非常基本的东西,我真的不需要诉诸正则表达式,我可能错过了一些东西。 请注意,由于各种原因,我仅限于PS v2


编辑:为了澄清,实际路径是可变的。用户在XML文件中提供一个路径,然后我验证该路径并对其进行处理。因此,用户可能希望删除某个路径中的所有TXT文件。或所有文件。甚至是所有文件和子文件夹。因此,需要支持C:\Somefolder\*。如果他们有C:\\Somefolder\*C:Somefolder\*我想将其标记为无效路径。但是C:\Somefolder\*当Somefolder不存在时,它不是一个无效路径,它是一个丢失的文件夹,我想将其标记为另一个错误。

您可以这样尝试吗:

Test-Path -IsValid C:\Somefolder
编辑:那么为什么不省略测试路径的wildchars呢

$test.Substring(0,($test.length-($test.Split("\")[-1]).length-1))

你能这样试试吗

Test-Path -IsValid C:\Somefolder
编辑:那么为什么不省略测试路径的wildchars呢

$test.Substring(0,($test.length-($test.Split("\")[-1]).length-1))

实际上,您需要一个正则表达式来验证路径规范。像这样的方法应该会奏效:

$re = '^[a-z]:[/\\][^{0}]*$' -f [regex]::Escape(([IO.Path]::InvalidPathChars -join ''))
'C:\something\*' -match $re   # returns $true
该表达式将匹配以字母后跟冒号、正斜杠或反斜杠开头的任何字符串,以及任意数量的有效路径字符

请注意,连续的路径分隔符在路径中是有效的,因此
C:\\something\*-match$re
也将按其应该的方式计算为
$true

如果要验证实际(现有)路径而不是路径规范,可以使用
Get ChildItem

function Test-WildcardPath($Path) {
  Get-ChildItem $Path -ErrorAction SilentlyContinue >$null
  return $?
}

同样,
C:\\something\*
将计算为
$true
,因为路径中允许使用连续的路径分隔符。

确实,您需要一个正则表达式来验证路径规范。像这样的方法应该会奏效:

$re = '^[a-z]:[/\\][^{0}]*$' -f [regex]::Escape(([IO.Path]::InvalidPathChars -join ''))
'C:\something\*' -match $re   # returns $true
该表达式将匹配以字母后跟冒号、正斜杠或反斜杠开头的任何字符串,以及任意数量的有效路径字符

请注意,连续的路径分隔符在路径中是有效的,因此
C:\\something\*-match$re
也将按其应该的方式计算为
$true

如果要验证实际(现有)路径而不是路径规范,可以使用
Get ChildItem

function Test-WildcardPath($Path) {
  Get-ChildItem $Path -ErrorAction SilentlyContinue >$null
  return $?
}

同样,
C:\\something\*
将计算为
$true
,因为路径中允许使用连续的路径分隔符。

要测试什么路径?
测试路径“C:\Somefolder”
足够好吗?您想测试什么路径?
测试路径“C:\Somefolder”
足够好吗?Milan和Andrey,请参阅修订的OP。在这种情况下,我必须支持通配符,因此C:\Somefolder不是一个选项。正如我所说的,我怀疑我最终会测试这个,因为我必须测试有效的通配符,当我找到它们时,我会在父文件夹上测试路径。在这方面,我想我可以将-like与转义通配符一起使用。Milan和Andrey,请参阅修订版OP。在这种情况下,我必须支持通配符,因此C:\Somefolder不是一个选项。正如我所说的,我怀疑我最终会测试这个,因为我必须测试有效的通配符,当我找到它们时,我会在父文件夹上测试路径。在这方面,我想我可以将-like与转义通配符一起使用。