繁体   English   中英

PowerShell 作业,写入文件

[英]PowerShell Jobs, writing to a file

在将 Start-Job 脚本块输出到文件时遇到一些问题。 以下三行代码工作没有任何问题:

$about_name = "C:\0\ps_about_name.txt"
$about = get-help about_* | select Name,Synopsis
if (-not (Test-
Path $about_name)) { ($about | select Name | sort Name | Out-String).replace("[Aa]bout_", "") > $about_name }

该文件创建在 C:\\0\\

但是我需要做很多这样的集合,所以我很自然地将它们作为单独的工作并行堆叠。 我遵循了在线示例,因此将上面的最后一行作为 Start-Job 调用的脚本块:

Start-Job { if (-not (Test-Path $about_name)) { { ($about | select Name | sort Name | Out-String).replace("[Aa]bout_", "") > $about_name } }

作业已创建,状态为 Running,然后状态为 Completed,但未创建文件 没有 Start-Job,一切正常,有了 Start-Job,什么都没有……我已经尝试了很多变体,但无法使用它来创建文件。 有人可以建议我在这方面做错了什么吗?

IMO,使用$using范围修饰符解决此问题的最简单方法。

$about_name = "C:\0\ps_about_name.txt"
$about = get-help about_* | select Name,Synopsis
$sb = { if (-not (Test-Path $using:about_name)) { 
          $using:about.Name -replace '^about_' | Sort-Object > $using:about_name 
        }
      }
Start-Job -Scriptblock $sb

解释:

$using允许您在远程命令中访问局部变量。 这在运行Start-JobInvoke-Command时特别有用。 语法是$using:localvariable

这个特殊问题是一个可变范围问题。 Start-Job创建一个具有自己范围的后台作业。 使用-Scriptblock参数时,您是在该范围内工作。 它不知道您当前范围/会话中定义的变量。 因此,您必须使用一种技术来定义作用域内的变量、传入变量的值或从脚本块访问局部作用域。 您可以在About_Scopes阅读有关范围的更多信息。

.Replace() ,.NET .Replace()方法不支持字符集[] 您需要切换到-replace以利用它们。 我更新了代码以使用-replace不区分大小写来执行替换。


HCM 完美的解决方案使用了一种将值传递到作业脚本块的技术。 通过在脚本块中定义参数,您可以使用-ArgumentList将值传递给该参数。


另一种选择是在Start-Job脚本块中定义您的变量。

$sb = { $about_name = "C:\0\ps_about_name.txt"
        $about = get-help about_* | select Name,Synopsis
        if (-not (Test-Path $about_name)) { 
          $about.Name -replace '^about_' | Sort-Object > $about_name 
        }
      }
Start-Job -Scriptblock $sb

您必须将参数发送到您的工作。 这不起作用:

$file = "C:\temp\_mytest.txt"
start-job {"_" | out-file $file}

虽然这样做:

$file = "C:\temp\_mytest.txt"
start-job -ArgumentList $file -scriptblock {
    Param($file)
    "_" | out-file $file
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM