這是一個簡單的腳本:
$srcpth = "C:\Users\Mark\Desktop\dummy\"
$files = Get-ChildItem -Path $srcpth -File -Recurse
foreach ($f in $files) {
$filen = $f.Name
$filesize = $f.Length
Write-Output "$filen $filesize"
}
這將正確回圈遍歷所有子檔案夾C:\Users\Mark\Desktop\dummy并輸出具有檔案大小的檔案名,但不會顯示相對路徑。如何解決相對路徑?謝謝。
編輯:在下面添加以澄清所需的輸出:
例如,下面C:\Users\Mark\Desktop\dummy是帶有檔案的子檔案夾
C:\Users\Mark\Desktop\dummy\file00.txt
C:\Users\Mark\Desktop\dummy\folder01\file01_01.txt
C:\Users\Mark\Desktop\dummy\folder01\file01_02.txt
C:\Users\Mark\Desktop\dummy\folder01\file01_03.txt
C:\Users\Mark\Desktop\dummy\folder02\file02_01.txt
C:\Users\Mark\Desktop\dummy\folder02\file02_01.txt
C:\Users\Mark\Desktop\dummy\folder03\file03_01.txt
C:\Users\Mark\Desktop\dummy\folder03\file03_02.txt
C:\Users\Mark\Desktop\dummy\folder03\file03_03.txt
C:\Users\Mark\Desktop\dummy\folder03\file03_04.txt
上面代碼的輸出產生:
file00.txt 9
file01_01.txt 10
file01_02.txt 12
file01_03.txt 12
file02_01.txt 15
file02_01.txt 14
file03_01.txt 11
file03_02.txt 15
file03_03.txt 13
file03_04.txt 12
但我想要的是:
file00.txt 9
\folder01\file01_01.txt 10
\folder01\file01_02.txt 12
\folder01\file01_03.txt 12
\folder02\file02_01.txt 15
\folder02\file02_01.txt 14
\folder03\file03_01.txt 11
\folder03\file03_02.txt 15
\folder03\file03_03.txt 13
\folder03\file03_04.txt 12
前面\,沒有斜線,或者.\很好。
uj5u.com熱心網友回復:
干得好:
$srcpth = "C:\Users\Mark\Desktop\dummy\"
$files = Get-ChildItem -Path $srcpth -File -Recurse
foreach ($f in $files) {
$filen = $f.Name
$filesize = $f.Length
$relativePath = $f.fullname.remove(0,($srcpth.length))
Write-Output "$filen $filesize $relativePath"
}
沒有任何具有您要查找的值的物件屬性。但是你可以像上面那樣計算它。當你試圖弄清楚這樣的事情時,查看物件的成員總是很有用的:
$files[0] | get-member
這將使您更好地了解可以使用的內容、可以使用的屬性以及可用的方法。
uj5u.com熱心網友回復:
我建議您像現在一樣輸出物件而不是字串,無論如何,您都可以使用以下方法獲取相對路徑.SubString(..):
foreach ($f in Get-ChildItem -Path $srcpth -File -Recurse) {
[pscustomobject]@{
FileName = $f.Name
FileSize = $f.Length
RelativePath = $f.FullName.Substring($srcpth.Length 1)
}
}
或者,如果您使用的是PowerShell Core,您可以訪問 .NET API Path.GetRelativePath(String, String):
foreach ($f in Get-ChildItem -Path $srcpth -File -Recurse) {
[pscustomobject]@{
FileName = $f.Name
FileSize = $f.Length
RelativePath = [IO.Path]::GetRelativePath($srcpth, $f.FullName)
}
}
也有適用于 Windows PowerShell 和 PowerShell Core 的PathIntrinsics.NormalizeRelativePath(String, String)Method,盡管這似乎有點矯枉過正:
$ExecutionContext.SessionState.Path.NormalizeRelativePath($f.FullName, $srcpth)
uj5u.com熱心網友回復:
雖然String.Substring()/.Remove()和解決方案在僅使用絕對本機路徑[IO.Path]::GetRelativePath()時就足夠了,但當引數為相對路徑或僅 PowerShell路徑時它們會失敗(請參閱本答案末尾的示例以了解它們如何失敗)。-PathGet-ChildItem
對于另外支持 PowerShell 路徑和相對路徑的解決方案,我建議使用Resolve-Path -Relative:
# For this demo, create a Powershell-only path.
$null = New-PSDrive -Name TempDrv -Root ([IO.Path]::GetTempPath()) -PSProvider FileSystem
$srcpth = 'TempDrv:\RelativePathTest'
$null = New-Item "$srcpth\subdir\test.txt" -Force
# Set base path for Get-ChildItem and Resolve-Path. This is necessary because
# Resolve-Path -Relative resolves paths relative to the current directory.
Push-Location $srcpth
try {
foreach ($f in Get-ChildItem -File -Recurse) {
[pscustomobject]@{
FileName = $f.Name
FileSize = $f.Length
RelativePath = Resolve-Path $f.FullName -Relative
# Alternative to remove ".\" or "./" prefix from the path:
# RelativePath = (Resolve-Path $f.FullName -Relative) -replace '^\.[\\/]'
}
}
}
finally {
# Restore current directory even in case of script-terminating error
Pop-Location
}
輸出:
FileName FileSize RelativePath
-------- -------- ------------
test.txt 0 .\subdir\test.txt
故障模式:
在我的系統上,這就是String.Substring()上述示例的 PowerShell 路徑方法失敗的原因(根據臨時目錄的位置,您可能會看到不同的結果):
FileName FileSize RelativePath
-------- -------- ------------
test.txt 0 ubdir\test.txt
這就是[IO.Path]::GetRelativePath()失敗的方式:
FileName FileSize RelativePath
-------- -------- ------------
test.txt 0 ..\..\..\..\temp\RelativePathTest\subdir\test.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/491585.html
