【问题标题】:Why does Powershell replace commas with whitespaces?为什么 Powershell 用空格替换逗号?
【发布时间】:2011-10-15 02:58:36
【问题描述】:

我正在 Powershell 中编写一些脚本来自动执行一项任务。该脚本将获取参数,例如:

PS > myscript.ps1 par=a,1,2,0.1 par=b,3,4,0.1 par=c,5,6,0.1 bin=file.exe exeargs="fixed args for file.exe"

简而言之,file.exe 是一个接受参数(包括 a、b 和 c)的可执行文件,此 ps1 脚本将在指定范围内执行 file.exe 传递参数 abc范围,以指定的精度改变它们。

问题是,我先将每个$arg in $args用字符“=”分割,然后我应该用“,”分割它们以获得指定的值。

问题是,当我这样做时:

foreach ($arg in $args)
{
    $parts = ([string] $arg).split("=")
    Write-Host $parts[1]
}

输出是

a 1 2 0.1
b 3 4 0.1
c 5 6 0.1
file.exe
fixed args for file.exe

也就是说,它已经用空格替换了“,”字符,所以我的第二次拆分应该是空格,而不是逗号。

你猜猜为什么会这样?

提前致谢!

【问题讨论】:

    标签: string powershell split


    【解决方案1】:

    首先,你为什么要把它写成 C 程序之类的?当Powershell具有更强大的参数概念时,您不必传递这样的参数,使用$args并拆分=等,您可以传递命名参数和参数而不是进行解析正在做。 (更多参数在这里:http://technet.microsoft.com/en-us/library/dd315296.aspx

    说到这里,我来回答你的问题:

    您正在做的是当您传入以下参数时:

    par=a,1,2,0.1 par=b,3,4,0.1 par=c,5,6,0.1 bin=file.exe exeargs="fixed args for file.exe"

    您正在传入数组数组。第一个元素是包含元素的数组:

    par=a
    1
    2
    0.1
    

    好的,开始分裂:

    当您执行[string] $a 时,您将数组转换为字符串。默认情况下,这意味着包含元素 1,2,3 的数组将变为 1 2 3

    所以你在par=a,1,2,0.1 的第一个参数变成par=a 1 2 0.1= 上的拆分意味着parts[1] 变成a 1 2 0.1,这就是你所看到的。

    那么如何保留逗号呢?

    只需将一个数组转换为一个字符串,其间有,而不是空格,对吗?

    这里有一些方法可以做到这一点:

    使用-join 运算符:

    foreach ($arg in $args)
    {
    
        $parts = ($arg -join ",").split("=")
        Write-Host $parts[1]
    }
    

    现在您将看到带有所需逗号的输出。

    另一种方式,使用$ofs特殊变量:

    foreach ($arg in $args)
    {
        $ofs =","
        $parts = ([string] $arg).split("=")
        Write-Host $parts[1]
    }
    

    (更多关于 $ofs 的信息:http://blogs.msdn.com/b/powershell/archive/2006/07/15/what-is-ofs.aspx

    免责声明 - 所有这些解释都是为了让您了解正在发生的事情。请不要继续此操作并使用参数。

    【讨论】:

      【解决方案2】:

      这发生在为您的脚本解析命令行时,而不是在 split() 方法期间。要看到这一点,请尝试在开头添加“Write-Host $args”,如下所示:

      Write-Host $args
      foreach ($arg in $args)
      {
          $parts = ([string] $arg).split("=")
          Write-Host $parts[1]
      }
      

      这是因为 ',' 字符用于分隔数组中的元素。例如:

      PS C:\temp> $a = 1,2,3
      PS C:\temp> Write-Host $a
      1 2 3
      PS C:\temp> $a.GetType()
      
      IsPublic IsSerial Name                                     BaseType
      -------- -------- ----                                     --------
      True     True     Object[]                                 System.Array
      

      试试这个命令行:

      .\myscript.ps1 "par=a,1,2,0.1" "par=b,3,4,0.1" "par=c,5,6,0.1" "bin=file.exe" "exeargs=fixed args for file.exe"
      

      【讨论】:

      • 是的,我尝试过类似的方法:将 par="a,1,2,0.1" 放在一起。但这很无聊,把 " 放在每个参数上。你知道 powershell 这样做的任何原因吗?ty
      • 已编辑 - 基本上是 ',' 字符使其解析为数组而不仅仅是字符串
      猜你喜欢
      • 2015-01-13
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 2014-10-31
      • 2017-11-18
      相关资源
      最近更新 更多