如何将PowerShell的文字双引号传递给本机命令?

 一粒星尘ch 发布于 2023-01-31 18:24

我想使用Powershell命令行在awk/gawk中打​​印字符串文字(具体程序不重要).但是,我认为我误解了引用规则 - PowerShell显然删除了本机命令的单引号内的双引号,但在将它们传递给命令行开关时却没有.

这适用于bash:

bash$ awk 'BEGIN {print "hello"}'
hello    <-- GOOD

这适用于PowerShell - 但重要的是我不知道为什么需要转义:

PS> awk 'BEGIN {print \"hello\"}'
hello    <-- GOOD

这在PowerShell中不打印任何内容:

PS> awk 'BEGIN {print "hello"}'
    <-- NOTHING IS BAD

如果这确实是在PowerShell中执行此操作的唯一方法,那么我想了解解释原因的引用规则链.根据http://technet.microsoft.com/en-us/library/hh847740.aspx上的PowerShell引用规则,这不是必需的.

开始解决方案

下面的Duncan提供的妙语是,您应该将此功能添加到您的powershell配置文件中:

 filter Run-Native($command) { $_ | & $command ($args -replace'(\\*)"','$1$1\"') }

或者特别是对于awk:

 filter awk { $_ | gawk.exe ($args -replace'(\\*)"','$1$1\"') }

结束解决方案

引号正确传递给PowerShell的echo:

PS> echo '"hello"'
"hello"    <-- GOOD

但是当呼唤外部"本地"程序时,引号会消失:

PS> c:\cygwin\bin\echo.exe '"hello"'
hello    <-- BAD, POWERSHELL REMOVED THE QUOTES

这是一个更清晰的例子,如果您担心Cygwin可能与此有关:

echo @"
>>> // program guaranteed not to interfere with command line parsing
>>> public class Program
>>> {
>>>    public static void Main(string[] args)
>>>    {
>>>       System.Console.WriteLine(args[0]);
>>>    }
>>> }
>>> "@ > Program.cs
csc.exe Program.cs
.\Program.exe '"hello"'
hello    <-- BAD, POWERSHELL REMOVED THE QUOTES

DEPRECATED示例,用于传递给cmd,它执行自己的解析(请参阅下面的Etan的评论):

PS> cmd /c 'echo "hello"'
"hello"     <-- GOOD

DEPRECATED示例,用于传递给bash,它执行自己的解析(请参阅下面的Etan的评论):

PS> bash -c 'echo "hello"'
hello    <-- BAD, WHERE DID THE QUOTES GO

任何解决方案,更优雅的解决方案或解释?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有