已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。
1年前关闭。
这篇文章被编辑并提交审查1年前,未能重新打开帖子:
原始关闭原因未解决
Improve this question
PowerShell中是否有更简洁、更少出错的方法来检查路径是否不存在?
对于这样一个常见的用例来说,这在客观上过于冗长:
if (-not (Test-Path $path)) { ... }
if (!(Test-Path $path)) { ... }
它需要太多的括号,并且在检查“不存在”时不是很可读。它也容易出错,因为像这样的语句:
if (-not $non_existent_path | Test-Path) { $true } else { $false }
实际上将返回False
,而用户可能期望True
。
什么是更好的方法来做到这一点?
**更新1:**我目前的解决方案是使用exist
和not-exist
的别名,如here所述。
**更新2:**一个建议的语法也将解决这个问题,允许以下语法:
if !(expr) { statements* }
if -not (expr) { statements* }
以下是PowerShell存储库中的相关问题(请投票支持👍):https://github.com/PowerShell/PowerShell/issues/1970
8条答案
按热度按时间3zwjbxry1#
如果您只想使用cmdlet语法的替代方法(特别是针对文件),请使用
File.Exists()
.NET方法:另一方面,如果你想为
Test-Path
创建一个通用的否定别名,你应该这样做:notexists
现在的行为与Test-Path
完全一样,但总是返回相反的结果:正如您已经展示的那样,相反的操作非常简单,只需将
exists
别名为Test-Path
:zlhcx6iw2#
你发布的别名解决方案是聪明的,但我反对在脚本中使用它,因为同样的原因,我不喜欢在脚本中使用任何别名;它倾向于损害可读性。
如果你想把它添加到你的配置文件中,这样你就可以输入快速命令或者把它用作shell,那么我可以看到这是有意义的。
您可以考虑使用管道:
或者,对于否定方法,如果适合您的代码,您可以将其设置为肯定检查,然后使用
else
作为否定检查:nlejzf6q3#
添加以下别名。我认为默认情况下,这些别名应该在PowerShell中可用:
这样,条件语句将更改为:
和
au9on6nz4#
这是我的PowerShell新手做这件事的方式
6yt4nkrj5#
另一种选择是使用
IO.FileInfo
,它为您提供了如此多的文件信息,它使生活更容易只是使用这种类型:More details on my blog.
jvlzgdj96#
要检查某个目录的路径是否存在,请使用以下命令:
要检查文件的路径是否存在,请使用@Mathias建议的方法:
qnzebej07#
在看了@Mathias R. Jessen的精彩回答后,我突然想到,你不需要创建两个新函数。相反,你可以创建一个 Package 器,围绕原生
Test-Path
函数使用相同的名称,添加一个-Not
开关:例如:
这有几个优点:
1.熟悉的语法:当你不使用自定义开关时,语法与本机命令相同,当你使用时,它会非常直观地显示发生了什么,这意味着用户的认知负担更少,共享时的兼容性更好。
1.因为 Package 器在后台调用本机函数,所以它将在本机函数的任何地方工作,例如:
c90pui9n8#