作者: Edengundam(马涛)
之前, 我曾经翻译过一个cmdlet命令: Test-Path, 这个命令用于确定路径的所有元素是否存在。今天, 我们主要查看一下该命令的参数IsValid.
首先, 我们先看下这个参数的描述:
-isValid <SwitchParameter>
确定路径的语法是否正确(不管路径的元素是否存在)。如果路径语法有效,则返回 True;如果其无效,则返回 False。
注意这里<SwitchParameter>意味着此参数不需要指定任何参数值(argument). 先让我们看几个例子:
PS C:Scripts> Test-Path c: -isValid # 我们期待这是个正确的目录
True

PS C:Scripts> Test-Path c:]] -isValid #这也是个正确的目录
True

PS C:Scripts> Test-Path c:/ -isValid #这个正确嘛?有疑问??
True

PS C:Scripts> Test-Path / -isValid #这个呢?看起来不像正确的.
False

PS C:Scripts> Test-Path z/ -isValid #这个肯定错了吧!
True

PS C:Scripts> Test-Path z/// -isValid #这个鬼东西...错了!
True

PS C:Scripts> Test-Path ac -isValid #看起来挺对的
True


怎么样, 这些结果是不是让你觉得很郁闷, 明明有些路径根本就是非法的, 为什么还会返回正确的结果呢??这是由于Test-Path只是简单的查看路径名中是否存在非法的字符. 请看下面的例子:
PS C:> Test-Path z/ -isValid -PathType Leaf
True
PS C:> Test-Path z/ -isValid -PathType container
True
PS C:scripts> New-Item z/ -ItemType container


目录: Microsoft.PowerShell.CoreFileSystem::C:scripts


Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2007-9-25 17:49 z


经过确认'z///'是合法路径后, 我们调用New-Item创建目录'z///', 结果只创建了目录'z'. 也许这是此命令的一个缺陷, 希望PowerShell的下个版本能让它按照我们期待的运行.
不过我个人觉得, 其实不管如何, 我们直接去尝试创建目录即可, 然后只需要使用trap捕获异常事件即可. 最后, 附赠一个小脚本, 可以输出ASCII码0-127中, 哪些字符禁止出现在路径中.
PS C:scripts> 32..127 | ?{ !(Test-Path -Path "$([char]$_)" -IsValid) } | %{ [char]$_ }
"
*
:
<
>
?
|

这里我省略了0-31的字符, 有兴趣的朋友可以自己试试^^