如何在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执行该文件:
- 创建
router_search.ps1文件,内容如下:
Get-ChildItem | Where-Object { $_.Name -match "router" }
- 编写GnuProlog代码:
:- initialization(main). main :- shell('powershell.exe -File "router_search.ps1"'), nl, halt.
内容的提问来源于stack exchange,提问作者odium
相关产品推荐
相关产品推荐

