如何使用PowerShell判断指定的文件夹是否在我的PATH中?

aydmsdu9  于 2023-06-23  发布在  Shell
关注(0)|答案(4)|浏览(146)

如何使用PowerShell判断指定的文件夹是否在我的PATH中?
像这样的函数会很棒:

function FolderIsInPATH($Path_to_directory) {
    # If the directory is in PATH, return true, otherwise false
}
cfh9epnr

cfh9epnr1#

Going off this question,你不需要一个函数,但可以用$Env:Path检索:

$Env:Path -split ";" -contains $directory

-contains运算符不区分大小写,这是一个额外的好处。将其放置在函数中以确保尾部斜杠被修剪可能是有用的,但这并不常见:

function inPath($directory) {
    return ($Env:Path -split ';').TrimEnd('\') -contains $directory.TrimEnd('\')
}
20jt8wwn

20jt8wwn2#

有一堆答案做$path.Split(";")$path -split ";"可能对99.9%的现实世界场景都很好,* 但是 * 有一个关于the accepted answer的评论是Joey的一个类似问题:
将失败,其中包含分号的引用路径。
基本上,这是一个边缘情况,但这是一个完全有效的PATH在Windows上:

c:\temp;"c:\my ; path";c:\windows

所以这里有一堆代码来解决这个问题

function Test-IsInPath
{
    param( [string] $Path, [string] $Folder )

    # we're going to treat the path as a csv record, but we
    # need to know how many columns there are so we can create
    # some fake header names. this might give a higher count
    # than the real value if there *are* quoted folders with
    # semicolons in them, but that's not really an issue
    $columnCount = $Path.Length - $Path.Replace(";","").Length

    # generate the list of column names. the actual names
    # don't matter - it's just so ConvertFrom-Csv treats our
    # PATH as a data row instead of a header row
    $headers = 0..$columnCount

    # parse the PATH as a csv record using ";" as a delimiter
    $obj = $path | ConvertFrom-Csv -header $headers -delimiter ";"

    # extract an array of all the values (i.e. folders)
    # in the record we just parsed
    $entries = $obj.psobject.properties.value

    # check if the folder we're looking for is in the list
    return $entries.Contains($Folder)

}

这是否是一个比简单的split方法“更好”的答案取决于您是否希望在PATH中包含包含分号的引用文件夹:-)...
示例用法:

PS C:\> Test-IsInPath -Path $env:PATH -Folder "c:\temp"
False

PS C:\> Test-IsInPath -Path "c:\temp;`"c:\my ; path`";c:\windows" -Folder "c:\temp"
True

PS C:\> Test-IsInPath -Path "c:\temp;`"c:\my ; path`";c:\windows" -Folder "c:\my ; path"
True

注意事项

  • 这个 still 没有解决的是那些以尾部“\”结尾的路径-例如当PATH包含C:\temp\时测试C:\temp,反之亦然。
  • 它也没有解决这里列出的路径处理的其他无数异常:如何检查%PATH%中是否存在目录
rsaldnfx

rsaldnfx3#

我会选这样的

function FolderIsInPATH {
    param (
        [parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]$your_searched_folder
        [parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]$Path
    )
    
    $Folders = Get-Childitem -Path $Path -Directory

    foreach ($Folder in $Folders) {
        if ($Folder.Name -eq $your_searched_folder) {
            ##Folder found
        } else {
            ##folder not found
        }
    }
}
qacovj5a

qacovj5a4#

您可以使用[Environment]::GetEnvironmentVariables()获取PATH

[Environment]::GetEnvironmentVariables()

或者,如果您想获取用户环境变量:

[Environment]::GetEnvironmentVariables("User")

接下来,获取PATH变量:

$Path = [Environment]::GetEnvironmentVariables().Path # returns the PATH

然后检查指定的文件夹是否在PATH中:

$Path.Contains($Path_to_directory + ";")

功能组合:

function FolderIsInPath($Path_to_directory) {
    return [Environment]::GetEnvironmentVariables("User").Path.Contains($Path_to_directory + ";")
}

但是,此函数区分大小写。您可以使用String.ToLower()使其不区分大小写。

function FolderIsInPath($Path_to_directory) {
    return [Environment]::GetEnvironmentVariables("User").Path.ToLower().Contains($Path_to_directory.ToLower() + ";")
}

现在像这样调用你的函数:

FolderIsInPath("C:\\path\\to\\directory")

请注意,路径必须是绝对路径。
正如mclayton的评论中指出的,这个函数对最后一个路径变量不起作用。要解决这个问题,只需在路径的末尾添加一个;。你的函数现在看起来像这样。

function FolderIsInPath($Path_to_directory) {
    return [Environment]::GetEnvironmentVariables("User").Path.ToLower() + ";".Contains($Path_to_directory.ToLower() + ";")
}

相关问题