作者: Edengundam(马涛)
之前, 我曾经翻译过一个cmdlet命令: Test-Path, 这个命令用于确定路径的所有元素是否存在。今天, 我们主要查看一下该命令的参数IsValid.
首先, 我们先看下这个参数的描述:
-isValid <SwitchParameter>
确定路径的语法是否正确(不管路径的元素是否存在)。如果路径语法有效,则返回 True;如果其无效,则返回 False。
注意这里<SwitchParameter>意味着此参数不需要指定任何参数值(argument). 先让我们看几个例子:
PS C
:
Scripts
>
Test
-
Path c
:
-
isValid
#
我们期待这是个正确的目录
True
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
PS C
:
Scripts
>
Test
-
Path c
:
]]
-
isValid
#
这也是个正确的目录
True
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
PS C
:
Scripts
>
Test
-
Path c
:/
-
isValid
#
这个正确嘛?有疑问??
True
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
PS C
:
Scripts
>
Test
-
Path
/
-
isValid
#
这个呢?看起来不像正确的.
False
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
PS C
:
Scripts
>
Test
-
Path z
/
-
isValid
#
这个肯定错了吧!
True
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
PS C
:
Scripts
>
Test
-
Path z
///
-
isValid
#
这个鬼东西...错了!
True
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
PS C
:
Scripts
>
Test
-
Path a
c
-
isValid
#
看起来挺对的
True
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
怎么样, 这些结果是不是让你觉得很郁闷, 明明有些路径根本就是非法的, 为什么还会返回正确的结果呢??这是由于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
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
目录
:
Microsoft
.
PowerShell
.
Core
FileSystem
::
C
:
scripts
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
Mode LastWriteTime
Length
Name
----
-------------
------
----
d
----
2007
-
9
-
25
17
:
49
z
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
经过确认'z///'是合法路径后, 我们调用New-Item创建目录'z///', 结果只创建了目录'z'. 也许这是此命令的一个缺陷, 希望PowerShell的下个版本能让它按照我们期待的运行.
不过我个人觉得, 其实不管如何, 我们直接去尝试创建目录即可, 然后只需要使用trap捕获异常事件即可. 最后, 附赠一个小脚本, 可以输出ASCII码0-127中, 哪些字符禁止出现在路径中.
PS C
:
scripts
>
32
..
127
|
?
{
!
(Test
-
Path
-
Path
"
$([char]$_)
"
-
IsValid) }
|
%
{ [char]
$_
}
"
*
:
<
>
?
|
这里我省略了0-31的字符, 有兴趣的朋友可以自己试试^^