2009-11-07 367 views
2

我有一个函数,可以根据输入将文件的文件路径写入文本文件。这听起来令人困惑,但我不知道一个更好的方式把它,所以这里的功能:使Powershell功能/任务在后台运行

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

编辑:

我用启动工作,如建议,具体如下:

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

回答

6

在您为后台作业创建的新作用域中,为您的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的脚本块传递的参数。我会推荐的是一个可以选择使用后台作业的功能。只要坚持这个函数定义在您的个人资料和你设置:

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的位置相同。

+0

假设我想在我的Powershell中使用此函数简介? – KdgDev 2009-11-07 14:58:09

+0

我更新了这个帖子。请注意添加了-AsJob参数。 – 2009-11-07 17:57:10

+0

我应该“只需在个人资料中添加此功能定义并设置好”。但是第三条最后一条线呢?有一个对WriteAllPaths.ps1的引用,它不存在。另外,如果我只是将此代码粘贴到我的配置文件中,最后3行的效果如何。它们不包含在函数中,但直接存在于配置文件中。所以每次Powershell启动时,它都会尝试执行它们。 – KdgDev 2009-11-08 18:52:51

1

PowerShell的哪个版本?在Powershell 2.0中,我认为你可以使用这个Start-Job的后台作业。

启动Windows PowerShell后台作业。

+0

我在Windows 7旗舰版上,所以我在猜测2.0 – KdgDev 2009-11-07 02:12:14

+0

然后在PsJob上阅读,开始/停止/等待/获取/删除/接收作业 – jitter 2009-11-07 02:43:18