Powershell 为什么工作脚本在后台运行时失败?
我有这样的脚本(这里简化): 当我直接运行它时,它会工作,但当我在后台运行它时:Powershell 为什么工作脚本在后台运行时失败?,powershell,windows-10,Powershell,Windows 10,我有这样的脚本(这里简化): 当我直接运行它时,它会工作,但当我在后台运行它时: Start-Job { .\sleeper.ps1 } 有一秒钟,它被视为正在运行,但不久之后就被视为失败,实际上根本没有创建文件“trash.txt”,因此即使是一次迭代也没有执行 这里出了什么问题?我认为主要问题在于$PWD和-FilePath参数,但我也将列出有关写入主机的一些信息: 启动作业应使用-FilePath参数运行。这是因为{}是一个ScriptBlock对象,默认情况下由-ScriptBloc
Start-Job { .\sleeper.ps1 }
有一秒钟,它被视为正在运行
,但不久之后就被视为失败
,实际上根本没有创建文件“trash.txt”,因此即使是一次迭代也没有执行
这里出了什么问题?我认为主要问题在于
$PWD
和-FilePath
参数,但我也将列出有关写入主机的一些信息:
启动作业
应使用-FilePath
参数运行。这是因为{}
是一个ScriptBlock
对象,默认情况下由-ScriptBlock
参数获取,这是您不想要的。该行的示例解决方案:Start Job-FilePath./script.ps1
- 默认情况下,
$PWD
或当前工作目录是在PowerShell作业中执行时当前用户的主目录/用户配置文件(Linux:$home
//Windows:$home/Documents
)。您可以通过使用该变量(在Windows上可能是$ENV:PWD?)执行作业来测试这一点。无论哪种方式,它都可能与执行此操作的目录不同<代码>trash.txt
正在生成并附加到,但它是在与当前目录不同的目录中生成的。您将希望脚本显式地包含要创建的文件的绝对路径,或者提供允许您在执行时输入路径的脚本参数。下面是另一篇StackOverflow文章,其中一位用户遇到了类似的问题,有两种很好的解决方案,一种是在脚本中使用$args
,另一种是使用开始作业的-InitializationScript
参数来设置$PWD
:
通常,写入主机
作为所选输出的优先级较低,而不是使用写入输出
/写入详细信息
/写入警告
/写入错误
。有关这方面的更多信息可在此处找到:-不过,较新版本的PowerShell添加了一个信息流,我相信这可能会使写入主机
输出更易于访问。有关流的更多信息,请参见关于重定向的帮助
尝试使用sleep.ps1的完整路径,看看这是否会产生影响。这可能与一些事情有关。首先,为什么要为此使用Write Host
?您使用写主机
而不是像写输出
/写详细
/写错误
/写警告
这样的东西是否有充分的理由?如果您不确定原因,请签出类似的内容以获取更多信息,以及有关重定向的帮助。另外,如果运行脚本,请使用Start Job-FilePath./script.ps1
而不是{}
,我相信这是在使用-ScriptBlock
@scriptautomatic,非常感谢。因此,根据您的提示,我现在可以运行脚本,但它不会将任何内容转储到文件中。目前我使用写入输出“循环…”输出文件-append trash.txt
。它在直接执行时工作(即在前台)。作为一个快速测试,我使用了重定向接收器的绝对路径,它工作正常,所以再次感谢您。
Start-Job { .\sleeper.ps1 }