You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GnuProlog中执行带管道的Shell命令?

解决GnuProlog中执行带管道的PowerShell命令问题

问题原因

GnuProlog的shell/1谓词会把命令交给系统默认Shell(Windows下是cmd.exe)处理,cmd会将管道符|解析为自身的管道操作,而非传递给PowerShell。这就导致Where-Object被当成了cmd的独立命令,而cmd无法识别该命令,从而报错。

可行实现方式

方式1:用PowerShell的-Command参数包裹完整命令

把带管道的PowerShell命令作为整体,通过-Command参数传递给powershell.exe,让PowerShell自行解析管道逻辑。注意Prolog字符串中的引号转义:

:- initialization(main).

main :- 
    shell('powershell.exe -Command "Get-ChildItem | Where-Object { $_.Name -match \"router\" }"'), nl, halt.

也可以用单引号包裹PowerShell命令(Prolog中内部单引号需转义):

:- initialization(main).

main :- 
    shell('powershell.exe -Command \'Get-ChildItem | Where-Object { $_.Name -match "router" }\''), nl, halt.

方式2:通过PowerShell脚本文件执行

如果命令逻辑复杂,可将命令写入单独的.ps1脚本文件,再让PowerShell执行该文件:

  1. 创建router_search.ps1文件,内容如下:
Get-ChildItem | Where-Object { $_.Name -match "router" }
  1. 编写GnuProlog代码:
:- initialization(main).

main :- 
    shell('powershell.exe -File "router_search.ps1"'), nl, halt.

内容的提问来源于stack exchange,提问作者odium

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:25:39