在 PowerShell 中检查路径是否存在的更好方法[关闭]

2024-04-17

PowerShell 中是否有更简洁且不易出错的方法来检查路径是否不存在?

对于这样一个常见的用例来说,客观上来说太冗长了:

if (-not (Test-Path $path)) { ... }
if (!(Test-Path $path)) { ... }

它需要太多括号,并且在检查“不存在”时可读性不太好。它也很容易出错,因为这样的语句:

if (-not $non_existent_path | Test-Path) { $true } else { $false }

实际上会返回False,当用户可能期望True.

有什么更好的方法来做到这一点?

更新1:我当前的解决方案是使用别名exist and not-exist正如所解释的here https://stackoverflow.com/a/31888581/450913.

更新2:也可以解决此问题的建议语法是允许以下语法:

if !(expr) { statements* }
if -not (expr) { statements* }

这是PowerShell存储库中的相关问题(请投票????):https://github.com/PowerShell/PowerShell/issues/1970 https://github.com/PowerShell/PowerShell/issues/1970


如果您只想替代 cmdlet 语法(特别是文件),请使用File.Exists().NET方法:

if(![System.IO.File]::Exists($path)){
    # file with path $path doesn't exist
}

另一方面,如果您想要通用的否定别名Test-Path,您应该这样做:

# Gather command meta data from the original Cmdlet (in this case, Test-Path)
$TestPathCmd = Get-Command Test-Path
$TestPathCmdMetaData = New-Object System.Management.Automation.CommandMetadata $TestPathCmd

# Use the static ProxyCommand.GetParamBlock method to copy 
# Test-Path's param block and CmdletBinding attribute
$Binding = [System.Management.Automation.ProxyCommand]::GetCmdletBindingAttribute($TestPathCmdMetaData)
$Params  = [System.Management.Automation.ProxyCommand]::GetParamBlock($TestPathCmdMetaData)

# Create wrapper for the command that proxies the parameters to Test-Path 
# using @PSBoundParameters, and negates any output with -not
$WrappedCommand = { 
    try { -not (Test-Path @PSBoundParameters) } catch { throw $_ }
}

# define your new function using the details above
$Function:notexists = '{0}param({1}) {2}' -f $Binding,$Params,$WrappedCommand

notexists现在将表现exactly like Test-Path,但总是返回相反的结果:

PS C:\> Test-Path -Path "C:\Windows"
True
PS C:\> notexists -Path "C:\Windows"
False
PS C:\> notexists "C:\Windows" # positional parameter binding exactly like Test-Path
False

正如您已经向自己展示的那样,相反的操作非常简单,只需别名即可exists to Test-Path:

PS C:\> New-Alias exists Test-Path
PS C:\> exists -Path "C:\Windows"
True
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PowerShell 中检查路径是否存在的更好方法[关闭] 的相关文章

随机推荐

  • 有“进度按钮”吗?

    我想要一个具有双重功能的按钮作为进度条 例如 随着任务的进展 按钮会填充绿色背景 我知道我可以创建自己的 但如果有现成的东西 我很乐意使用它 有谁知道适合该要求的免费或商业组件吗 我希望它能在 Delphi 2007 中工作 但如果它仅在
  • glBitmap 问题

    我正在使用一些遗留代码来工作 它使用 glBitmap 调用来绘制位图图标 我的问题是 一旦你一次绘制大约 1000 个图标 它就会变得相当慢 它会减慢到大约 1 到 2 秒的刷新率 我想看看是否可以让它更快 首先我应该描述当前代码是如何工
  • 长度为 k 的非重叠子串的随机采样

    给定一个长度的字符串n 我将如何 伪 随机采样m大小子串k这样采样的子串就不会重叠 我的大部分脚本编写经验都是使用 Perl 但任何通用语言的易于运行的解决方案就足够了 如果输入中不能出现某个字符 例如X just my size 20 m
  • 如何删除损坏的图像框?

    我正在尝试构建一个电子邮件模板 其中我必须向不同的邮件客户端 例如 Outlook thunderbird 显示一些图像 现在的问题是 当这些客户端不允许显示图像时 会显示我不想显示的损坏的图像框 我也参考过 参考链接1 https i s
  • 如何将嵌套字典转换为带有键顺序的列表

    我想从嵌套字典中创建一个列表 Name 20 Paul Merrill 21 Brynne S Barr Phone 20 1 313 739 3854 21 939 4818 Address 20 916 8087 Vehicula Rd
  • 调用未定义的方法 mysqli_result::fetch()

    我能够从中获取数据get result 使用任何fetch assoc fetch all 和fetch row 但是当我尝试使用简单的fetch 只是 我收到这个错误 未捕获的错误 调用未定义的方法 mysqli result fetch
  • 应用部分比 Monad 部分可以更好优化的 monad 示例

    在一次讨论中我听说Applicative一些解析器的接口的实现方式不同 但比它们的更有效Monad界面 原因是与Applicative在运行整个有效计算之前 我们提前知道所有 效果 对于 monad 效果可能取决于计算期间的值 因此这种优化
  • Apache Beam:DoFn 与 PTransform

    Both DoFn and PTransform是一种定义操作的方法PCollection 我们如何知道何时使用哪个 理解它的一个简单方法是类比map f 对于列表 高阶函数map将函数应用于列表的每个元素 返回结果的新列表 您可以将其称为
  • 每n秒运行某些代码[重复]

    这个问题在这里已经有答案了 有没有办法 例如打印Hello World 每n秒 例如 程序会执行我拥有的任何代码 然后一旦过了 5 秒 time sleep 它将执行该代码 我会用它来更新文件 而不是打印 Hello World 例如 st
  • 在 SQL Server 2005 存储过程中使用 .NET Framework 3.5

    我有一个 SQL Server 2005 服务器 我想在其上运行 Net CLR 存储过程 但是 我想使用 NET Framework 3 5 如果我现在尝试这个 我会收到以下错误 Error Assembly system core ve
  • 在 C++ 程序中包含 C 头文件

    我有一个 C 程序 cpp 在其中我希望使用 C 头文件中存在的一些函数 例如 stdio h conio h stdlib h graphics h devices h 等 我可以将 stdio h 库包含在我的 cpp 文件中 如下所示
  • 冲突:被其他getUpdates请求终止;确保只有一个机器人实例正在运行

    有人遇到这样的错误吗 我该如何修复它们 2021 11 07 08 29 38 643 telegram ext updater ERROR Error while getting Updates Conflict terminated b
  • 如何在角度指令中绑定布尔值?

    我想将一些布尔属性绑定 设置到指令 但我真的不知道如何做到这一点并实现以下行为 想象一下 我想为结构设置一个标志 假设列表是否可折叠 我有以下 HTML 代码
  • 源操作数和目标操作数是否需要相同大小?

    我刚刚尝试了这个问题 要求你解释一下代码行有什么问题 movl eax rdx 解决方案表明目标操作数的大小错误 仅当从较大尺寸变为较小尺寸时才 非法 还是源操作数和目标操作数对于所有指令 或至少 mov 类类型 必须具有相同的尺寸 是的
  • POV-Ray:在脚本中设置输出分辨率或宽度/高度比

    我有一个代码可以生成一堆 pov使用 POV Ray 进行可视化的文件 不幸的是 它们具有不同的纵横比 宽度 高度 该信息以向上 向右向量的形式存在于脚本中 但是 当我渲染没有任何额外参数的脚本时 即通过povray test pov PO
  • 如何在初始化数据库时显示启动屏幕?

    我创建了一个启动画面 效果非常好 现在我想在显示启动屏幕的同时加载数据库 并在数据库完全加载后显示应用程序 UI 我有以下代码来执行此操作 对吗 public class Splash extends Activity Override p
  • 从 MySQL 中的字符串中删除引号和逗号

    我正在从一个导入一些数据CSV文件 以及大于的数字1000变成1 100 etc 有什么好方法可以从中删除引号和逗号 以便我可以将其放入int field Edit 数据实际上已经在 MySQL 表中 所以我需要能够使用 SQL 来完成此操
  • JavaScript 正则表达式 - g 修饰符不起作用[重复]

    这个问题在这里已经有答案了 我有以下代码 var str 4 shnitzel 5 ducks var rgx new RegExp 0 9 g console log rgx exec str chrome 和 firefox 上的输出是
  • 如果Bokeh有很多图表,输出文件很重并且系统很慢

    我使用散景 我非常喜欢Bokeh 因为Bokeh有很多图表并且输出文件非常简单 我在半导体公司工作 有时我会分析半导体 数据 我有很多数据 我制作了很多图表 可能是 1000 4000 次图表操作 我用Bokeh来制作图表 但是Bokeh很
  • 在 PowerShell 中检查路径是否存在的更好方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 PowerShell 中是否有更简洁且不易出错的方法来检查路径是否不存在 对于这样一个常见的用例来说 客观上来说太冗长了 if not Test