我正在尝试安排Powershell任务,该任务的一部分会定期测试Internet连接并将输出发送到文件。 '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”参数。究竟是什么导致无法识别相同的参数?
答案 0 :(得分:1)
-Argument
的{{1}}参数期望将字符串传递给它。将参数值用引号引起来,PowerShell会将其解释为字符串。
New-ScheduledTaskAction
在此使用单引号而不是双引号的原因是将字符串原样保留,称为文字字符串。单引号内的所有内容都告诉PowerShell不要执行变量扩展。您可以使用双引号,这将需要转义您要实际传递的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'
和$
。另一种选择是将参数值作为字符串存储在变量中(仍然使用单引号)。然后只需将变量传递给"
参数即可。
通过简单的示例,您可以看到所描述的行为:
-Argument
有关字符串扩展和使用两种引号的更多说明,请参见About Quoting Rules。
答案 1 :(得分:0)
AdminOfThings的回答消除了错误消息。我能够将语句注册为计划任务。