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 }