首页 > 解决方案 > 测试路径失败但不做其他事情

问题描述

我正在尝试测试多条路径,如果有任何失败,请创建路径。

$subFolders = "$sortByProject$projectName\Originals", "$sortByProject$projectName\Pulled", "$sortByProject$projectName\Retouched", "$sortByProject$projectName\Uploaded"
if(!(Test-Path -Path "$sortByProject$projectName", "$subFolders")){
  New-Item -ItemType Directory -Path "$sortByProject$projectName", "$subFolders"
}

测试发现"$sortByProject$projectName"存在但"$subFolders"失败,因此输出如下所示:

True
False

我认为由于返回 false ,它将移至 new-item 命令并构建所有四个请求的文件夹(.\originals, .\pulled, .\retouched .\uploaded)。所有变量都已正确命名,并在独立调用时返回所需的路径。我认为混乱是因为有多个项目分配给$subfolders,但我不明白为什么。

我还认为这段代码很草率,很想学习一种更好的方法来进行多路径测试并创建任何缺失的路径。

标签: powershellif-statement

解决方案


您不需要显式测试目录路径的存在:

只需New-Item'-Force开关与 结合使用-ItemType Directory,它将按需创建指定的目录- 包括父目录 - 同时不理会现有目录(并返回描述预先存在的/新创建的目录的目录信息对象)。

New-Item -Force -ItemType Directory -Path $subFolders

至于你尝试了什么:

  • 您的Test-Path命令返回一个布尔数组, PowerShell 会考虑布尔上下文中的任何 2+ 元素数组$true- 无论其元素值如何;有关 PowerShell 的 to-Boolean 强制规则的摘要,请参阅此答案的底部部分。

  • -Path "$sortByProject$projectName", "$subFolders"有两个问题:

    • 不仅在 PowerShell中作为命令参数传递的双引号变量值永远不需要,在数组变量的情况下$subFoldersusing"$subFolders"将数组转换为包含用空格分隔的(字符串化)元素的单个字符串
    • 如果你通过使用来纠正这个直接的问题,
      -Path $sortByProject$projectName, $subFolders就会发现另一个问题:你实际上是在传递一个锯齿状数组,它的第一个元素是一个字符串,第二个元素是一个嵌套数组,这会中断调用。
      • 纠正这个问题可能需要一种不明显的方法:你必须使用+而不是,为了构造一个平面数组,这反过来又要求 LHS 已经是一个数组,这需要使用一元形式的,数组构造函数运算符,和切换到包含在(...)分组运算符中的表达式:
        -Path (, $sortByProject$projectName + $subFolders)

推荐阅读