首页 > 解决方案 > 使用 -Filepath 参数通过 Powershell ScheduledJob 调用 $PSScriptRoot 时为空

问题描述

使用 Powershell ScheduledJob 时不会填充自动变量 $PSScriptRoot(不要与 ScheduledTask 混淆)。

带有指定本地脚本的 -Filepath 参数的 ScheduledJob:

-Filepath "C:\Scriptpath\Script.ps1"

无法填充 $PSScriptRoot。

Get-Job 显示它没有运行脚本,而是像读取 .txt 文件一样输出脚本。 错误的

带有 -Scriptblock 和&调用运算符的 ScheduledJob 指定本地脚本:

-Scriptblock {& "C:\Scriptpath\Script.ps1"}

成功填充 $PSScriptRoot。

Script.ps1 可以很简单

$PSScriptRoot | out-file "C:\Test.txt"

问题似乎是任务计划程序中的作业如何执行文件,而不是 .ps1 中的语法错误。因为如果通过 -Scriptblock 参数调用相同的脚本也可以工作。在任何一种情况下,都会执行脚本,因为 Out-File 将创建一个空白 txt 文件。

两种用法似乎都符合 Microsoft 的文档:

https://docs.microsoft.com/en-us/powershell/module/psscheduledjob/register-scheduledjob?view=powershell-5.1

任何有关行为的指导都会有所帮助。

编辑:

我注意到的是 Get-Job,它显示了计划作业正在执行的“命令”。

如果使用 -Scriptblock。Get-Job 显示脚本块的确切内容,如上所示。

& "C:\Scriptpath\Script.ps1"

如果使用 -Filepath。Get-Job 显示文件的内容。

$PSScriptRoot | out-file "C:\Test.txt"

这就像它正在复制文件的内容然后调用它们。这可以解释为什么 $PSScriptRoot 无法填充。

.... ~测试噪音~

$PWD | Out-File "C:\file.txt"

在文件中显示 $PWD 恰好是执行计划作业的用户帐户的 $Home 变量。我想我正在做某事。

标签: powershell

解决方案


您似乎在描述两个问题:

  1. $PSScriptRoot在某些情况下无人居住。

  2. 带有 -FilePath 参数的 Set-ScheduledJob 显示文件的内容而不是执行它。

对于#1:$PSScriptRoot 有一个未解决的问题,但很难说情况是否符合您的用例,因为......您没有提供任何代码。我建议你添加更多的源代码来解释你的代码是如何使用的$PSScriptRoot

对于#2:Set-ScheduledJob 的文档: -Filepath似乎需要一个 .ps1 文件,但您的示例显示了一个非 .ps1 文件正在传递。

-文件路径

指定计划作业运行的脚本。输入本地计算机上.ps1 文件的路径。要指定脚本参数的默认值,请使用 ArgumentList 参数。每个计划的作业都必须具有 ScriptBlock 或 FilePath 值。

'c:\Filepath' 处的脚本实际上是否具有 .ps1 扩展名?如果没有,请给它一个并更改您的-Filepath参数以匹配。

可能是一个问题导致另一个问题,但从当前的文本中不清楚它们是如何相关的。


推荐阅读