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

Dan*_*n R 3 powershell

我对powershell比较陌生,我发现一个奇怪的是我不确定如何解释.

这输出就好了.

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

另一方面,这会抛出一个错误:

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jas*_*gan 7

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

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

这是在不明确的情况下使用的实际代码:

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

该语法创建一个单独的字符串对象,以传递-MessageWrite-Warning命令中的参数,这是它期望的第一个位置参数.您还可以指定参数名称(参见上面的示例),以确保其他人可以读取代码,并且解释器完全理解您的意图.