【问题标题】:PowerShell Start-Job not creating or amending filesPowerShell Start-Job 未创建或修改文件
【发布时间】:2019-11-22 04:20:43
【问题描述】:

我是 PowerShell 新手,这是我第一次尝试使用作业。我遇到了一个问题,我有一个脚本的一部分来查找文件,如果它不存在则创建它然后修改文件,并且当我运行脚本(不是作为作业)时它正确执行,但是当我把它放在工作中时,它不会修改文件。

我所拥有的一个非常简化的示例是这样的:

Start-job -Name HostCheck -ScriptBlock {
     ForEach ($Host in (Get-Content -Path .\HostFile.txt) {
          Add-Content .\somefile.txt "`nWrite something on a new line for $Host"
     } | Out-Null
} 

# Removes job once it is finished
Get-Job -Name HostCheck | Wait-Job | Remove-Job

现在我尝试在| Out-Null 之后添加| Receive-Job,但这似乎没有任何改变。

我见过人们将整个脚本块写入一个变量,然后只使用该变量,所以我很好奇这是否是必需的(但我不这么认为)。

另外,这可能很重要,我使用 .bat 文件打开脚本,该文件将 PowerShell 控制台升级为管理员,并将进程的执行策略设置为绕过。现在看来,在该控制台会话中运行或由该控制台会话启动的所有内容(运行了几个脚本,这只是其中一个脚本的一部分)似乎继承了这些设置,但是对于工作来说是新的,我不知道它是否也会继承这些设置,或者我将如何强制它(如果不是)。

【问题讨论】:

    标签: powershell jobs


    【解决方案1】:

    我发现了问题:

    -您当前的工作目录在开始工作时会丢失,因此我的相对路径 .\somefile.txt 将默认为 C:\Users\[Username]\Documents 而不是 .\somefile.txt 所在的位置。

    我可以通过使用绝对路径来解决这个问题,或者我认为有一种方法可以将参数传递给作业,但如果有人知道更好的方法,请随时发表评论。

    【讨论】:

    • 您可以在脚本块中使用 param ( ),并使用 -args 传递给它。 PS 7 将有一个用于启动作业的 -workingdirectory 参数。或者你可以使用 using: scope 来引用一个全局变量。
    【解决方案2】:

    这是一个解决方法,cd 到调用者的当前目录。

    start-job { cd $using:pwd; pwd } | Receive-Job -wait -auto
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      相关资源
      最近更新 更多