如何找出递归操作的确切位置?

时间:2018-09-26 08:30:44

标签: powershell filesystems

我的问题是,替换字符串需要根据指定文件所在的文件夹深度进行更改,而我不知道如何获取该信息。我需要使用相对地址。

我希望脚本从需要更正所有文件的文件夹上方的2个文件夹级别运行。因此,我在第1行中设置了$ path。该文件夹假定为“深度0”。在这里,替换字符串必须采用原始格式-> stylesheet.css

对于“深度0”以下一级文件夹中的文件,替换字符串必须以../为前缀-> ../stylesheet.css

对于“深度0”以下两级文件夹中的文件,替换字符串需要以../两次加前缀-> ../../stylesheet.css。 ...等等...

我被困在这里:

$depth = $file.getDepth($path) #> totally clueless here

我需要$depth包含根$path下的文件夹数。

我怎么能得到这个?这是我其余的代码:

$thisLocation = Get-Location
$path = Join-Path -path $thisLocation -childpath "\Files\depth0"
$match = "findThisInFiles"
$fragment = "stylesheet.css" #> string to be prefixed n times
$prefix = "../" #> prefix n times according to folder depth starting at $path (depth 0 -> don't prefix)
$replace = "" #> this will replace $match in files
$depth = 0

$htmlFiles = Get-ChildItem $path -Filter index*.html -recurse

foreach ($file in $htmlFiles)
{
    $depth = $file.getDepth($path) #> totally clueless here
    $replace = ""
    for ($i=0; $i -lt $depth; $i++){
        $replace = $replace + $prefix
    }
    $replace = $replace + $fragment

    (Get-Content $file.PSPath) |
    Foreach-Object { $_ -replace $match, $replace } |
    Set-Content $file.PSPath
}

2 个答案:

答案 0 :(得分:1)

这是一种获取位置中所有文件的文件夹结构深度的方法。希望这可以帮助您朝正确的方向

New-Item -Path "C:\Logs\Once\Test.txt" -Force
New-Item -Path "C:\Logs\Twice\Folder_In_Twice\Test.txt" -Force

$Files = Get-ChildItem -Path "C:\Logs\" -Recurse -Include *.* | Select-Object FullName

foreach ($File in $Files) {
    [System.Collections.ArrayList]$Split_File = $File.FullName -split "\\"
    Write-Output ($File.FullName + " -- Depth is " + $Split_File.Count)
}

输出仅用于说明

C:\Logs\Once\Test.txt -- Depth is 4
C:\Logs\Twice\Folder_In_Twice\Test.txt -- Depth is 5

答案 1 :(得分:1)

这是我编写的函数,该函数递归使用Split-Path来确定路径的深度:

Function Get-PathDepth ($Path) {
    $Depth = 0
    While ($Path) {
        Try {
            $Parent = $Path | Split-Path -Parent
        }
        Catch {}

        if ($Parent) {
            $Depth++
            $Path = $Parent
        }
        else {
            Break
        }
    }
    Return $Depth
}

用法示例:

$MyPath = 'C:\Some\Example\Path'

Get-PathDepth -Path $MyPath

返回3。

不幸的是,我不得不将Split-Path包装在Try..Catch中,因为如果您将根路径传递给它,则会引发错误。这很不幸,因为这意味着真正的错误不会导致异常的发生,但目前尚无法解决。

使用Split-Path的好处是,无论是否使用尾随\,您都应获得一致的计数。