我正在尝试安排一个Powershell任务,其中一部分定期测试互联网连接并将输出发送到文件。 “Test-Connection”cmdlet的“Count”参数被接受为独立语句,但是当移植到New-ScheduledTaskAction并分配给变量时,无法识别“Count”参数。
这有效:
Test-Connection 8.8.8.8 -Count 2 -Quiet |
ForEach-Object { "$(Get-Date -Format "[yyyy-MM-dd HH:mm:ss]") $_" } |
Out-File -Append -FilePath C:\Users\xxxxxx\Desktop\internet-log.txt
但转移到:
$InternetConnectionLog=New-ScheduledTaskAction
-Execute "powershell.exe"
-Argument Test-Connection 8.8.8.8 -Count 2 -Quiet |
ForEach-Object { "$(Get-Date -Format "[yyyy-MM-dd HH:mm:ss]") $_" } |
Out-File -Append -FilePath C:\Users\xxxxxx\Desktop\internet-log.txt
我被告知:
New-ScheduledTaskAction : A parameter cannot be found that matches parameter name 'Count'.
At line:1 char:108
+ ... ute "powershell.exe" -Argument Test-Connection 8.8.8.8 -Count 2 -Quie ...
+ ~~~~~~
+ CategoryInfo : InvalidArgument: (:) [New-ScheduledTaskAction], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,New-ScheduledTaskAction
生成的错误消息专门指向'Count'参数是问题所在。究竟是什么阻止相同的参数被识别?
-Argument
的New-ScheduledTaskAction
参数需要传递一个字符串。将参数值括在引号中会使PowerShell将其解释为字符串。
$InternetConnectionLog = New-ScheduledTaskAction -Execute "powershell.exe" -Argument 'Test-Connection 8.8.8.8 -Count 2 -Quiet |
ForEach-Object {
"$(Get-Date -Format "[yyyy-MM-dd HH:mm:ss]") $_"
} | Out-File -Append -FilePath C:\Users\xxxxxx\Desktop\internet-log.txt'
这里双引号单引号的原因是保持字符串不变,称为文字字符串。单引号内的所有内容都告诉PowerShell不执行变量扩展。您可以使用双引号,这将需要转义PowerShell的特殊字符,您希望在您的情况下像$
和"
一样传递。另一种方法是将参数值作为字符串存储在变量中(仍然使用单引号)。然后将变量传递给-Argument
参数。
通过更简单的示例,您可以看到所描述的行为:
$a = "I am a string"
$a.gettype().name
String
$b = "What am I? $a"
$b
What am I? I am a string
$c = 'What am I? $a'
$c
What am I? $a
$d = 'I want to keep my "double quotes" and $dollars$.'
$d
I want to keep my "double quotes" and $dollars$.
有关字符串扩展和使用两种类型的引号的进一步说明,请参阅About Quoting Rules。
AdminOfThings的答案消除了错误消息。我能够将该语句注册为计划任务。