Tim*_*imB 5 windows powershell
如何使用Powershell查找属于哪个分区文件?想要使用它来查找作为访问路径安装的分区,因此它没有分配 DriveLetter。
在 Linux 中,我们可以使用以下命令来执行此操作:
df /path/to/some/file.txt
Run Code Online (Sandbox Code Playgroud)
我知道我们可以使用 Get-Partition 列出分区,使用 Get-Volume 或 Get-WmiObject win32_volume 列出卷,但是我无法找到一种简单的编程方法来查找特定文件所属的分区。
我们可以从 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 }
Run Code Online (Sandbox Code Playgroud)
该-match-followed逐$matches招提取WMI关系字符串的相关部分。我们必须对反斜杠进行转义,因此进行替换。然后,由于只有简单的驱动器号分配在其Directory值的末尾有反斜杠,如果没有反斜杠,我们需要添加一个,以避免在类似命名的挂载点上出现误报。
要使用该脚本,请将其另存为 PS1 文件,例如df.ps1. 要在您的系统上启用脚本的执行,请按照PowerShell 标记 wiki的启用脚本部分中的说明进行操作。然后你可以像这样运行它:
.\df.ps1 -File C:\some\mounted\path\doc.txt
Run Code Online (Sandbox Code Playgroud)
结果与从任何其他使用返回的对象类型相同Get-Volume:
DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining Size
----------- ------------ -------------- --------- ------------ ----------------- ------------- ----
<redacted> NTFS Fixed Healthy OK 1.93 GB 1.95 GB
Run Code Online (Sandbox Code Playgroud)
请注意它是如何没有的DriveLetter,因为这个特定文件实际上位于与保存我的 C 驱动器根目录的卷不同的卷上。
| 归档时间: |
|
| 查看次数: |
755 次 |
| 最近记录: |