Powershell 我怎样才能找到递归操作工作的确切位置?

Powershell 我怎样才能找到递归操作工作的确切位置?,powershell,filesystems,Powershell,Filesystems,我的问题是,替换字符串需要根据指定文件所在的文件夹深度进行更改,我不知道如何获取该信息。我需要使用相对地址 我想脚本运行从2个文件夹以上的所有文件都需要更正的文件夹级别。所以我在第1行设置了$path。该文件夹假定为“深度0”。在这里,替换字符串需要采用其本机格式->stylesheet.css 对于“深度0”以下一级文件夹中的文件,替换字符串的前缀必须为。/一次->。/stylesheet.css 对于“深度0”以下两级文件夹中的文件,替换字符串的前缀必须为。/两次->。/../stylesh

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

我想脚本运行从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
}

下面是一种获取某个位置中所有文件在文件夹结构中的深度的方法。希望这能帮你找到正确的方向

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

下面是我编写的一个函数,它递归地使用
splitpath
来确定路径的深度:

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

不幸的是,我不得不在一个
Try..Catch中包装
Split Path
,因为如果将根路径传递给它,它就会抛出一个错误。这是不幸的,因为这意味着真正的错误不会导致异常发生,但目前无法找到解决方法


使用
分割路径
的优点是,无论是否使用尾随的
\
,都应该获得一致的计数

好的,我将删除我的评论,不是因为它只是分散了你的注意力。你可以使用
-split
-replace
对其进行拆分,以找出所谓的“分段”数量。在
反斜杠上拆分并替换空空格。但要开始工作可能会很棘手。在我了解到满足大多数需求的拆分路径之前,我就已经做过了。你能做一个你认为的
分割路径叶吗?类似于
If($Parent-eq(“C:\”+$Leaf))
来检查它是否处于最后一个循环?我试图避免在根字母/路径中进行硬编码。
($path-split“\\”[0]+“\”
可以添加以动态获取它。但是,如果路径是UNC路径,则不确定它是否可以工作。另一个选项可能是通过
(get Item$path).root.Name
获取根目录。但是,该功能只适用于实际路径,并且可能会被权限问题绊倒,我想,这一切都很顺利。在foreach循环内和开始$path处使用$file.PSpath。2-1的差值给出了我所需要的相对距离。你真了不起!试试看!问题是,通过计算$file.PSpath中的“\”分隔符,我已经找到了一种类似的方法(几乎在你给出答案的同时)。但结果是到绝对根的“距离”,而不是到$path。我想在进入for循环之前需要找到偏移量。非常感谢你的帮助