作者: 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 a c - isValid # 看起来挺对的
True
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 a c - 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 . Core FileSystem :: C : scripts
Mode LastWriteTime Length Name
---- ------------- ------ ----
d ---- 2007 - 9 - 25 17 : 49 z
True
PS C :> Test - Path z / - isValid - PathType container
True
PS C : scripts > New - Item z / - ItemType container
目录 : Microsoft . PowerShell . Core FileSystem :: 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的字符, 有兴趣的朋友可以自己试试^^