我在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]
}
即,它已经用空格替换了“,”字符,所以我的第二个分割应该是空格,而不是逗号。
有关它为何会发生的任何猜测?
提前致谢!
答案 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"