我想使用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
任何解决方案,更优雅的解决方案或解释?