【问题标题】:Search directory for a file, iterating up parent directories if not found在目录中搜索文件,如果找不到则向上迭代父目录
【发布时间】:2017-08-12 06:25:16
【问题描述】:

鉴于:

$path = c:\dir1\dir2\dir3\dir4\dir5

我想从最低的子目录 (dir5) 开始搜索 var.txt

如果有var.txt,请执行一些操作,如果没有,请在下一级(在本例中为dir4)搜索var.txt 并重复。

可能相关的链接:

How I could use test-path to check for var.txt

Recursion, maybe?

想法:

以某种方式使用Split-Path,在循环中迭代-Parent,并在每次迭代中使用test-path检查var.txt


解决方案:

将下面的解决方案与操作结合起来,如果在最高目录中找不到则中断循环:

$file = ""
$path = ""
while($path -and !(Test-Path (Join-Path $path $file))){
    if($path -eq ((Split-Path -Path $path -Qualifier)+"\")){
        break
    }
    else {
        $path = Split-Path $path -Parent
    }
}
if($path -ne ((Split-Path -Path $path -Qualifier)+"\")){
    #do something
}

【问题讨论】:

  • 你有没有尝试过,如果有,你能告诉我们吗? SO 最适合用作解决特定问题的资源。
  • 嗨,凯,道歉。目的是找到项目的根目录。通过脚本,本地根目录的所有子目录中的每个文件都将被复制到网络驱动器,从而保留文件夹结构。我想我会合并脚本将搜索以获取粘贴目标的 txt 文件。但是,由于项目文件夹位于客户端文件夹中,并且客户端可以有多个项目,因此我需要从右到左解析文件的路径。我今天开始使用 PowerShell,只有一个想法。我的想法在解决方案中得到了执行。

标签: powershell


【解决方案1】:

试试这个(递归方法):

function GetPathIfFileExist($pathtosearch, $filename)
{
   if($pathtosearch -eq "")
   {
       "file not founded"
   }
   elseif (Test-Path "$pathtosearch\$filename" )
   {
       $pathtosearch
   }
   else
   {
      GetPathIfFileExist (Split-Path $pathtosearch) $filename
   }
}

GetPathIfFileExist "c:\dir1\dir2\dir3\dir4\dir5" "var.txt"

【讨论】:

  • 感谢您提供这个替代解决方案 - 使用这种递归方法比 while 分割路径方法有什么好处吗?
  • 我不认为有真正的区别,除了可读性。做你的选择:)
【解决方案2】:
$path = 'c:\dir1\dir2\dir3\dir4\dir5'
while($path -and !(Test-Path (Join-Path $path 'var.txt'))){
    $path = Split-Path $path -Parent
}
Write-Output (Join-Path $path 'var.txt')

假设 var.txt 存在于其中一个目录中,并且您知道路径。

【讨论】:

  • 抱歉先生 - 我曾为你投票,但因为我的声望不到 15,我认为它不会公开显示。这个问题也获得了负面分数,侮辱伤害。该解决方案按预期工作。我在while 循环中插入了ifelse 语句来执行给定的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 2012-06-20
  • 2014-02-25
  • 2020-05-20
  • 1970-01-01
相关资源
最近更新 更多