2009-11-07 101 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