为什么Powershell用空格替换逗号?

时间:2011-10-15 02:58:37

标签: string powershell split

我在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传递args a,{{1} }和b在指定的范围内,按指定的精度改变它们。

问题是,我首先将每个c除以字符“=”,然后我应该用“,”将它们拆分以获得指定的值。

事情是,当我这样做时:

$arg in $args

输出

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

即,它已经用空格替换了“,”字符,所以我的第二个分割应该是空格,而不是逗号。

有关它为何会发生的任何猜测?

提前致谢!

2 个答案:

答案 0 :(得分:3)

首先,你为什么要像C程序一样写它?你不必传递这样的参数,使用$args并拆分=等等,当Powershell有一个更强大的参数概念时,你可以传递命名的参数和参数而不是解析你正在做的事情。 (有关参数的更多信息: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

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

答案 1 :(得分: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"