【问题标题】:How to extract the elements of the path variable that contain a specific word如何提取路径变量中包含特定单词的元素
【发布时间】:2021-04-08 11:33:48
【问题描述】:

我想提出一个命令来搜索我的路径变量并输出包含搜索关键字的文件夹。例如:我想输出路径变量中包含的所有路径,其中包含单词“python”(不区分大小写)。

我的路径是这样的:

C:\Program Files\ConEmu\ConEmu\Scripts;C:\Program Files\ConEmu;C:\Program Files\ConEmu\ConEmu;C:\Program Files\AdoptOpenJDK\jre-11.0.4.11-hotspot\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft VS Code\bin;C:\Program Files(x86)\PDFtk\bin\;C:\Program Files\ffmpeg\bin;C:\Program Files\ffmpeg\avconv\bin;C:\Program Files\ffmpeg\curl\bin;C:\Program Files\nodejs\;C:\Program Files\Git\cmd;C:\Program Files(x86)\Gpg4win\..\GnuPG\bin;C;C:\Users\jc\AppData\Local\Programs\Python\Python38-32\Scripts\;C:\Users\jc\AppData\Local\Programs\Python\Python38-32\;C:\Users\jc\AppData\Roaming\npm;C:\Program Files\OpenSSH;C:\Users\jc\.ssh;C:\Program Files(x86)\Nmap;C:/Users/jc/AppData/Local/Programs/Python/Python38-32/python.exe;

预期结果是:

C:\Users\jc\AppData\Local\Programs\Python\Python38-32\Scripts\;C:\Users\jc\AppData\Local\Programs\Python\Python38-32\;C:/Users/jc/AppData/Local/Programs/Python/Python38-32/python.exe;

到目前为止,我有一个选择每条路径的正则表达式公式(参见示例here)。我的正则表达式是:

C.*?;\gmi

如果我尝试 path | findstr "C.*?;"

什么都没有出现(它不应该输出与该正则表达式匹配的所有行吗?)。另外,我将如何输出包含预期搜索关键字的路径?谢谢

【问题讨论】:

  • 不是grep,不支持很多正则表达式功能。见more about how to use findstr。请注意,您可能希望为 Windows 安装 grep。或者使用 Powershell,它是内置的并且支持 .NET 正则表达式。

标签: cmd path


【解决方案1】:

这将做必要的:

for %A IN ("%PATH:;=" "%") DO @ECHO=%~A | FINd /I "Python"

【讨论】:

  • 您能解释一下 ("%PATH:;=" "%") 部分的作用吗?我知道这是一个循环,它采用每条路径,回显它并过滤“python”,但无法理解括号之间的那部分。谢谢!
  • 如果%PATH% 中列出的任何目录包含双引号、分号或& 符号,上述解决方案将失败,所有这些在其字符串条目中都是完全有效的。
  • @Compo 分号在路径中无效,它们将表示路径中的单独路径,并且不能用于目录或文件名,额外的冒号没有区别,除了完全在路径中无效,因此如果以与操作系统相同的方式输入错误,您将解析它们,并且它们是否有效对手头的任务本身没有影响,因为如果它们是,那么它们对操作系统,并且是由手工或写得不好的程序的胖指法条目创建的,无论如何都是垃圾。
  • @Compo 双引号的问题可能是我们可以看到有人在手动将它们输入注册表时添加的问题,尽管我在 20 年内从未见过任何程序实际上添加双引号引用路径变量,这并不意味着它不会发生,所以我们当然可以添加一个步骤并创建一个临时变量来去除路径中的任何错误引号。这可能是一个很小的机会,但添加该选项并没有什么坏处。 :)
  • @jlo "%PATH:;=" "%" 部分将变量用外引号括起来,并用一组双引号、一个空格和另一组双引号替换分号(用于分隔路径变量内的路径)使用 CMD 的“变量替换”引用。这应该有效地将所有路径用双引号括起来,并允许默认的 For 循环快速解析它们
【解决方案2】:

这不是很困难。该代码使用 PowerShell 拆分 Path 环境变量,然后检查每个变量是否与命令行上的第一个参数匹配不区分大小写。

=== search_path_for.bat

@SET "SEARCH_FOR=%~1"
@powershell -NoLogo -NoProfile -Command ^
    "$Env:Path -split [Io.Path]::PathSeparator |" ^
        "ForEach-Object { if ($_ -match '%SEARCH_FOR%') { $_ } }"

=== 用法

C:>search_path_for.bat "bin"
C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin
C:\Program Files\TortoiseSVN\bin
C:\Program Files\Microsoft VS Code\bin
C:\ProgramData\chocolatey\bin
C:\Users\lit\bin

=== 获取单个字符串结果

@SET "SEARCH_FOR=%~1"
@powershell -NoLogo -NoProfile -Command ^
    "($Env:Path -split [Io.Path]::PathSeparator |" ^
        "ForEach-Object { if ($_ -match '%SEARCH_FOR%') { $_ } }) -join [Io.Path]::PathSeparator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2021-11-13
    • 2017-12-01
    • 1970-01-01
    • 2018-08-18
    相关资源
    最近更新 更多