วิธีค้นหาไฟล์พาร์ติชั่นที่เป็นของ Powershell


5

วิธีค้นหาไฟล์พาร์ติชั่นที่ใช้ Powershell ต้องการใช้สิ่งนี้เพื่อค้นหาพาร์ติชันที่เมาท์เป็น accesspath ดังนั้นจึงไม่มีการกำหนด DriveLetter

ใน Linux เราสามารถใช้คำสั่งดังต่อไปนี้:

df /path/to/some/file.txt

ฉันทราบว่าเราสามารถแสดงรายการพาร์ติชั่นโดยใช้ Get-Partition, ลิสต์รายการโดยใช้ Get-Volume หรือ Get-WmiObject win32_volume แต่ฉันไม่สามารถหาวิธีที่ง่ายในการค้นหาพาร์ติชั่นที่เป็นไฟล์


@facebook รหัสที่น่าสนใจ แต่ไม่มีอะไรในรหัสนี้ทำในสิ่งที่ฉันต้องการ
TimB

เมื่อคุณได้รับสิ่งนี้ให้ตรวจสอบและทดสอบกับที่นี่: justpaste.it/1cmfr แต่ฉันยินดีที่จะปรับและ / หรือเพิ่มเป็นคำตอบหากคุณพบว่ามีประโยชน์ ฉันคิดว่าคุณสามารถทำให้มันเป็นฟังก์ชั่นสคริปต์ที่จะส่งผ่านข้อโต้แย้งแรกไปตามที่ฉันได้แสดงความคิดเห็นหรืออะไรก็ตาม ฉันต้องไปที่อื่นด้วย Linux Mint เพื่อเล่นด้วย df เอาท์พุทคำสั่งเพื่อให้ตรงกับ 100% แม้ว่า
Pimp Juice IT

@facebook วิธีการแก้ปัญหาของคุณจะทำงานเฉพาะเมื่อมีการกำหนดตัวเลื่อนสำหรับพาร์ติชัน PSDrive.name สำหรับการรับไอเท็มจะไม่ส่งคืนค่าที่ถูกต้องหากพาร์ติชันติดตั้งอยู่ในไดเรกทอรี (AccessPath)
TimB

คุณใช้ Windows ในการเมานท์กับเส้นทางแทนที่จะเป็นอักษรชื่อไดรฟ์คืออะไร ฉันไม่คิดว่าฉันเคยทำมาก่อน แต่ช่วยฟื้นฟูความทรงจำของฉัน ฉันไม่แน่ใจ AccessPath อย่างใดอย่างหนึ่ง แต่ฉันลืมสิ่งต่าง ๆ ตั้งแต่ฉันผลักดันสิ่งต่าง ๆ มากมายผ่านหัวของฉันทุกวัน
Pimp Juice IT

ฉันเห็นด้วยซ้ำวิธีนี้แสดงตัวอักษรระบุไดรฟ์: howtogeek.com/98195/... . ฉันไม่ทราบว่า Windows ติดตั้งอยู่ที่พา ธ ของโฟลเดอร์อย่างที่ลินุกซ์คิดหรือไม่ฉันคิดว่าตำแหน่ง "เมาท์" ที่เข้าถึงได้ของ Windows OS นั้นเป็นตัวอักษรชื่อไดรฟ์ ฉันอาจเข้าใจผิดเพราะฉันไม่คุ้นเคยกับฟังก์ชั่นนั้นใน Windows เว้นแต่ฉันจะลืมบางสิ่งบางอย่าง คุณอ้างถึงพา ธ ไฟล์ใด df กำหนดตารางเส้นทางไฟล์ในตัวอย่างของคุณดังนั้นเส้นทางไฟล์ในตัวอย่าง Windows ของคุณคืออะไร
Pimp Juice IT

คำตอบ:


5

เราสามารถรับรายการจุดเชื่อมต่อได้จากคลาส WMI Win32_MountPoint. ที่ให้เราทำแผนที่ระหว่างเส้นทางปริมาณและไดเรกทอรีราก จากนั้นเราสามารถหาจุดเมานท์ที่เฉพาะเจาะจงมากที่สุดสำหรับไฟล์ที่กำหนด ในที่สุดเราสามารถใช้ ID ปริมาณจากวัตถุจุดเมานท์เพื่อรับข้อมูลบางอย่างเกี่ยวกับปริมาณ นี่คือสคริปต์เต็มรูปแบบ:

param (
    [string]$File
)
$fullPath = [string](Resolve-Path $File)
$bestMatch = ''
$bestMatchObj = $null
gwmi Win32_MountPoint | % {
    $_.Directory -match '="(.*)"' | Out-Null
    $mountDir = $matches[1].Replace('\\', '\')
    If (!$mountDir.EndsWith('\')) { $mountDir = $mountDir + '\' }
    If ($fullPath.StartsWith($mountDir, 'InvariantCultureIgnoreCase') -and $bestMatch.Length -lt $mountDir.Length) { 
        $bestMatch = $mountDir
        $bestMatchObj = $_
    }
}
$bestMatchObj.Volume -match '="(.*)"' | Out-Null
$volPath = $matches[1].Replace('\\', '\')
Get-Volume | ? { $_.Path -eq $volPath }

-match -ติดตามโดย- $matches เคล็ดลับแตกส่วนที่เกี่ยวข้องของสตริงความสัมพันธ์ WMI เราต้อง unescape แบ็กสแลชดังนั้นการแทนที่ จากนั้นเนื่องจากการกำหนดตัวอักษรไดรฟ์อย่างง่ายเท่านั้นจึงมีเครื่องหมายแบ็กสแลชในตอนท้าย Directory มูลค่าเราต้องเพิ่มหนึ่งรายการหากไม่มีเพื่อหลีกเลี่ยงผลบวกปลอมในจุดเมานท์ที่มีชื่อคล้ายกัน

หากต้องการใช้สคริปต์ให้บันทึกเป็นไฟล์ PS1 เช่น df.ps1. หากต้องการเปิดใช้งานการเรียกใช้สคริปต์ในระบบของคุณให้ทำตามคำแนะนำในส่วนการเปิดใช้งานสคริปต์ของ แท็ก PowerShell wiki . จากนั้นคุณสามารถเรียกใช้ดังนี้:

.\df.ps1 -File C:\some\mounted\path\doc.txt

ผลลัพธ์เป็นชนิดเดียวกับวัตถุที่ส่งคืนจากการใช้งานอื่น ๆ Get-Volume:

DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining    Size
----------- ------------ -------------- --------- ------------ ----------------- -------------    ----
            <redacted>   NTFS           Fixed     Healthy      OK                      1.93 GB 1.95 GB

สังเกตว่ามันไม่มี DriveLetterเนื่องจากไฟล์นี้โดยเฉพาะในไดรฟ์ข้อมูลที่แตกต่างจากที่เก็บรากของไดรฟ์ C ของฉัน


+1 . . ฉันไม่แน่ใจว่าคุณจะไปได้หรือไม่ ฉันทดสอบกับสิ่งนี้: justpaste.it/1cmla แต่นั่นคือสิ่งที่ฉันสามารถทำได้ เป็นคนที่ดีมาก!
Pimp Juice IT

เยี่ยมมาก! ใกล้กับโซลูชันของฉันที่ได้รับก่อนหน้านี้ในความคิดเห็น: gwmi win32_volume | โดยที่ {"c: \ path \ to \ a \ file.txt" .StartWith ($ _. name, "CurrentCultureIgnoreCase")} | จัดเรียง {$ _. name.length} -desc | เลือก -First 1 ดูเหมือนว่าอาจไม่มีวิธีแก้ปัญหาที่ง่ายกว่านี้เพราะฉันหวังว่า :(
TimB

@TimB ดีใจที่ฉันช่วยได้! หากคำตอบของฉันแก้ไขปัญหาได้อย่างสมบูรณ์คุณสามารถคลิกเครื่องหมายถูกที่อยู่ติดกับ ยอมรับมัน ระบุถึงผู้อ่านในอนาคตว่าทำงานได้หรือไม่ หากมีสิ่งใดที่ควรปรับปรุงโปรดแจ้งให้เราทราบ
Ben N
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.