我的问题是,替换字符串需要根据指定文件所在的文件夹深度进行更改,而我不知道如何获取该信息。我需要使用相对地址。
我希望脚本从需要更正所有文件的文件夹上方的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
}
答案 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
的好处是,无论是否使用尾随\
,您都应获得一致的计数。