对于各种应用程序,我需要获取一些文件的父文件夹以用于创建其他输出。
$x = "C:\MyFolder\test.txt"
$parent = Split-Path (Split-Path $x) -Leaf
这工作正常,除非我接近顶层。
$x = "C:\test.txt"
$parent = Split-Path (Split-Path $x) -Leaf
这行得通,$parent = C:\
但没有 -Leaf
这样的。我剩下的可能是“D:、E:、F:”,甚至可能是网络位置。一般情况下,处理这些情况的好方法是什么?
我能做到:
if ($parent.length -eq 3) {
handle-top-level-situation
}
但这感觉有点不雅。当我以这种方式检查父文件夹名称时,是否有更好的方法来检查顶层?
最佳答案
基于 .NET API 的解决方案:
将您的路径转换到
获取父目录名称[System.IO.FileInfo]
允许您通过.Directory.Name
[System.IO.Path]::IsRooted()
告诉您名称是代表根目录还是 UNC 共享。
"C:\MyFolder\test.txt", "C:\test.txt" | ForEach-Object {
$parent = ([IO.FileInfo] $_).Directory.Name
if ([IO.Path]::IsPathRooted($parent)) {
"parent dir. is root path: $parent"
} else {
"parent dir. name: $parent"
}
}
输出:
parent dir. name: MyFolder
parent dir. is root path: C:\
或者,如果您想预先排除根目录中的文件,甚至在尝试提取父目录名称之前,您可以使用regex。与 -notmatch
:
"C:\MyFolder\test.txt", "C:\test.txt" | ForEach-Object {
if ($_ -notmatch '^[a-z]:\\.+?\\.|^\\\\.+?\\.+?\\.') {
"file is located in a root dir: $_"
} else {
"parent dir. name: " + ([IO.FileInfo] $_).Directory.Name
}
}
注意:以上假设:
常规完整路径(
\
不会意外加倍,例如在c:\\temp
中),尽管可以调整正则表达式来处理它们。Windows 路径分隔符,即
\
;要使正则表达式跨平台,请将所有\\
实例替换为[\\/]
。
关于PowerShell,检测根父文件夹的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73989936/