Как я могу узнать точное местоположение, где работает рекурсивная операция? - PullRequest
0 голосов
/ 26 сентября 2018

Моя проблема в том, что строка для замены должна меняться в зависимости от глубины папки, в которой находится указанный файл, и я не имею понятия, как получить эту информацию.Мне нужно работать с относительными адресами.

Я хочу, чтобы скрипт запускался с двух уровней папок над папкой, где находятся все файлы, которые нужно исправить.Итак, я установил $ path в строке 1. Предполагается, что эта папка имеет значение «Глубина 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 голосов
/ 26 сентября 2018

Вот функция, которую я написал, которая рекурсивно использует 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 заключается в том, что вы должны получить непротиворечивую информацию.считать независимо от того, используется ли трейлинг \ или нет.

0 голосов
/ 26 сентября 2018

Вот способ получить глубину в структуре папок для всех файлов в местоположении.Надеюсь, что это поможет вам в правильном направлении

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...