Powershell:为什么写输出和写警告对字符串和变量的处理方式不同?

时间:2014-04-07 19:14:31

标签: powershell

我对PowerShell相对较新,我发现一个奇怪的是我不确定如何解释。

输出正常。

write-output $var.Name.padright(40)" - "(get-date -format s)" : Creating on $var1"

另一方面,这会引发错误:

write-warning $var.Name.padright(40)" - "(get-date -format s)" : Creating on $var1"

Write-Warning : A positional parameter cannot be found that accepts argument ' - '.
At Y:\test.ps1:228 char:22
+         write-warning <<<<  $var.name.padright(40)" - "(get-date -format s)" : Creating on $var1"
+ CategoryInfo          : InvalidArgument: (:) [Write-Warning], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.WriteWarningCommand

知道为什么吗?如果我想完成上述工作,我会这样做:

$warning = $var.Name.padright(40) + " - " + (get-date -format s) + " : Creating on $var1"
write-warning $warning

我已经找到了一种解决方法,正如您所看到的,但我想了解为什么字符串连接对于写入输出的工作方式与写入警告不同。有没有理由我应该首先将字符串显式创建为变量而不仅仅是使用简写?

1 个答案:

答案 0 :(得分:7)

不是关于如何创建字符串,而是关于解释器正在寻找什么。 Write-output有一个名为inputobject的参数,它接受一个或多个PSobjects。写警告正在寻找单个字符串对象。

您使用的语法并不理想,当您使用cmdlet时,请尝试使用您发送到每个参数的内容。

这是在不清楚的情况下使用的实际代码:

Write-Warning -Message "$($var.Name.padright(40)) - $(get-date -format s) : Creating on $var1";

该语法创建一个字符串对象,以传递到-Message命令的Write-Warning参数,这是它作为第一个位置参数所期望的。您还可以指定参数名称(参见上面的示例),以确保其他人可以读取代码,并且口译员完全理解您的意图。