gpt4 book ai didi

windows - 使 Powershell 函数/任务在后台运行

转载 作者:可可西里 更新时间:2023-11-01 09:43:58 27 4
gpt4 key购买 nike

我有一个函数可以根据您的输入将文件的文件路径写入文本文件。这听起来令人困惑,但我不知道有更好的表达方式,所以这里是函数:

Function writeAllPaths([string]$fromFolder,[string]$filter,[string]$printfile) {
Get-ChildItem -Path $fromFolder -Recurse $filter | Select-Object -Property FullName > $printfile
}

第一个参数是您开始搜索的文件夹。
第二个参数,过滤器。 *.zip 例如,将列出所有 zip 文件。第三个参数,您必须提供文本文件的最终位置。

示例用法:writeAllPaths c:\*.zip c:\allZips.txt

问题是,当我这样做时,Powershell 在完成之前不会接受命令。这不是很有成效。有没有办法让它在启动时在后台运行。最好在完成后给出一些信息。我可能会打开任何在此过程中创建的文件...

此外,我使用的是 Windows 7,所以我猜我有 Powershell 2.0

是的,我不确定:p

编辑:

我按照提示使用了Start-Job,如下:

Function writeAllPaths([string]$fromFolder,[string]$filter,[string]$printfile) {
Start-Job -ScriptBlock {Get-ChildItem -Path $fromFolder -Recurse $filter | Select-Object -Property FullName > $printfile}
}

但是,文件并未创建。旧函数确实会创建一个文件。

EDIT2:最好在我的 Powershell 配置文件中包含此功能。这样,我可以随时执行它,而不是每次启动 Powershell 时都必须加载特定的 ps1 文件。

可以找到有关 Powershell 配置文件的更多信息 here您可以通过键入以下命令来召唤您自己的个人资料:notepad $profile

最佳答案

在您为后台作业创建的新范围中,未定义为您的 WriteAllPaths 函数定义的参数。试试这个,你会发现它们不是:

Function writeAllPaths([string]$fromFolder,[string]$filter,[string]$printfile) 
{
Start-Job { "$fromFolder, $filter, $printFile" }
}

$job = WriteAllPaths .\Downloads *.zip zips.txt
Wait-Job $job
Receive-Job $job

, ,

试试这个:

Function writeAllPaths([string]$fromFolder, [string]$filter, [string]$printfile) 
{
Start-Job {param($fromFolder,$filter,$printfile)
"$fromFolder, $filter, $printfile" } `
-ArgumentList $fromFolder,$filter,$printfile
}

$job = WriteAllPaths .\Downloads *.zip z.txt
Wait-Job $job
Receive-Job $job

.\Downloads, *.zip, z.txt

现在您看到了输出,因为我们通过 -ArgumentList 将参数传递给了脚本 block 。我推荐的是一个可以选择使用后台作业的功能。只需将此函数定义粘贴到您的个人资料中即可:

function WriteAllPaths([string]$FromFolder, [string]$Filter, 
[string]$Printfile, [switch]$AsJob)
{
if (![IO.Path]::IsPathRooted($FromFolder)) {
$FromFolder = Join-Path $Pwd $FromFolder
}
if (![IO.Path]::IsPathRooted($PrintFile)) {
$PrintFile = Join-Path $Pwd $PrintFile
}

$sb = {
param($FromFolder, $Filter, $Printfile)
Get-ChildItem $FromFolder -r $filter | Select FullName > $PrintFile
}

if ($AsJob) {
Start-Job $sb -ArgumentList $FromFolder,$Filter,$PrintFile
}
else {
& $sb $FromFolder $Filter $PrintFile
}
}

像这样(同步地)测试函数:

$job = WriteAllPaths Downloads *.zip z.txt -AsJob
Wait-Job $job
Receive-Job $job

请注意,我正在测试路径是否为根目录,如果不是,我将在当前目录之前添加。我这样做是因为后台作业的起始目录并不总是与您执行 Start-Job 的位置相同。

关于windows - 使 Powershell 函数/任务在后台运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1691612/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com