让shell解析或做你自己的解析(powershell / cmd)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让shell解析或做你自己的解析(powershell / cmd)相关的知识,希望对你有一定的参考价值。

我使用命令行参数开发应用程序,并在cmd shell和powershell中使用它。很明显,在我的应用程序的main()中,参数的接收方式不同。

static void Main(string[] args)
{
  // In cmd shell:  args[0] == "-ipaddress=127.0.0.1"
  // In powershell: args[0] == "-ipaddress=127"
  //            and args[1] == ".0.0.1"
}

示例:myApp.exe -ipaddress = 127.0.0.1

在我的C#应用​​程序中,根据我启动应用程序的shell,参数的解释会有所不同。

  • 在cmd shell中:arg [0] = - ipaddress = 127.0.0.1
  • 在powershell中:arg [0] = - ipaddress = 127和arg [1] =。0.0.1

这里的最佳做法是什么?

  • 我应该加入所有args []并解析我的应用程序中的参数吗?
  • 我应该依赖shell的解析器吗?
答案

我会完全放弃cmd shell支持,只是创建了适当的PowerShell cmdlet。 Writing a Windows PowerShell Cmdlet。但我不知道你的具体要求。

通常,从cmd和PowerShell调用可执行文件应该以相同的方式工作。例如行,“> ping -n 3 google.com”无论你把它放在哪里都能正常工作。

另一答案

tl;博士:

从PowerShell调用时,将整个参数括在'...'(单引号)中以确保它按原样传递:

myApp.exe '-ipaddress=127.0.0.1'

你遇到了一个解析错误[1],其中PowerShell在第一个-中打破了一个以.开头的不带引号的参数

以下简化示例演示了:

# Helper function that echoes all arguments.
function Out-Argument { $i = 0; $Args | % { 'arg[{0}]: {1}' -f ($i++), $_ }}

# Pass an unquoted argument that starts with "-" and has an embedded "."
Out-Argument -foo=bar.baz

以上产量:

arg[0]: -foo=bar
arg[1]: .baz

[1]从Windows PowerShell v5.1 / PowerShell Core v6.0.1开始,存在推定的错误,并且一直是reported on GitHub。 这个bug的PSv2变种会影响.,当它被包含在"..."的内部时 - 参见我的this answer

以上是关于让shell解析或做你自己的解析(powershell / cmd)的主要内容,如果未能解决你的问题,请参考以下文章

linux学习shell:人工解析lnmp脚本

Bash Shell 解析路径获取文件名称和文件夹名

shell脚本获取进程ID并杀死的实现及问题解析

linux的shell脚本中if,for,while的解析与应用

pipeline 解析

Ansible常见错误解析