[英]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-Job
和Invoke-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.