2011-10-15 110 views
2

我在Powershell中做了一些脚本来自动执行任务。该脚本是会得到参数,如:为什么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 abc在指定的范围内,以指定的精度改变'em'。

问题是,我首先用字符“=”分割每个$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 

也就是说,它已经取代了空白的“”性格,所以我的第二裂应该与空格,而不是逗号。

任何猜测为什么会发生?

在此先感谢!

回答

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特殊的变量:(更多与此$ OFS:http://blogs.msdn.com/b/powershell/archive/2006/07/15/what-is-ofs.aspx

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

免责声明 - 所有这一切都说明,让你明白发生了什么。请不要继续并使用参数。

2

这发生在脚本的命令行解析中,而不是在split()方法中。看到这一点,尝试把一个“写主机的$ 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" 
+0

是的,我试过类似的东西:把'par =“a,1,2,0.1”'等等。但是,这是无聊的,把“围绕每一个参数。你知道为什么PowerShell这样做吗? – Girardi

+1

编辑 - 基本上','字符使它解析为一个数组而不是一个字符串 – user995048