亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用于提高狀態行性能的 Powershell 作業

用于提高狀態行性能的 Powershell 作業

C#
HUH函數 2022-12-24 10:14:34
我正在開發自定義 powershell 狀態線,并實現了一些很酷的功能:電池監控、wifi 監控等。不幸的是,這些更新往往很慢,因為它們需要調用 Get-NetAdapterStatistics、獲取 wmi 對象和其他非常緩慢的通話。我正在嘗試通過 start-job 生成子進程以允許后臺輪詢和更新共享變量,但無法弄清楚如何執行此操作。我找到的最好的替代品是一種 IPC(如此處所述:兩個單獨的 Powershell 進程之間的管道傳輸),但如果可能的話,我更愿意堅持使用傳統的共享變量。有沒有辦法做到這一點?我發現的最佳替代方法是將變量作為參數傳遞,但這不允許進行輪詢。免責聲明,我知道這并不是 powershell 的真正設計目的,但我仍然想知道這是否可能?;蛘呤蔷帉憣⒎祷貭顟B行的 ac/c++ 二進制文件的最佳選擇?寫入文件(這看起來可能很慢)?如果可以,或者如果您需要更多信息,請告訴我什么可能有效。謝謝你。更多信息:Start-Job -Name testJob -Script {        $testVar = "asdf"}Write-Host $testVar# should output asdf有什么辦法嗎?我正在嘗試做一些工作并返回一個變量。這怎么可能?我發現的唯一可能方法是:寫文件到磁盤,有點慢使用 IPC 管道:最大的缺點是它有點小故障。最重要的是,當我關閉 powershell 窗口(因為這是一個狀態行)時,我不知道如何關閉 IPC 管道,我最終得到一個“管道泄漏”,導致高 cpu 使用率和運行的 powershell 進程的背景。這至少不是直接寫入文件的后臺作業的情況。顯然,當最后一個引用被刪除時,管道應該關閉,但后臺作業在它打開的情況下繼續運行。這是因為 powershell 會話在等待與管道相關的內容(等待管道連接、完成寫一行等)時將掛起到無法按 ctrl-c'd 的位置。謝謝,如果我可以添加更多信息,請告訴我。更新:我試過基本上使用空文件作為控制標志(我認為這比為每個設置解析一個文件要快),但我正在嘗試使用一個作業來返回 VCS 信息(這會更容易返回,并且快點)。關于如何解決這個問題的任何想法?我很難過。注意:我標記這個 C# 是因為 powershell 使用 C# 的管道函數,我希望有這方面知識的人能夠提供幫助。
查看完整描述

1 回答

?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

Boe Prox多年前就此做了一篇出色的文章。他還使用PoshRSJob模塊對此進行了擴展。使用這個模塊可以很容易地處理這個問題。

#Create a synchronized hashtable

$sync = [hashtable]::Synchronized(@{

    Time = ''

    Stop = $false

    Updater = ''

})

#create 5 RSJobs

1..5 | Start-RSJob -ScriptBlock {

    param($sync) #accept $sync as a param

    $updater = [Guid]::NewGuid() #unique id per job

    while(-not $sync.Stop) { #run until told not to

        $sync.Time = Get-Date

        $sync.Updater = $updater

        start-sleep -Seconds 1

    }

} -ArgumentList $sync #pass $sync as a param

運行這個會產生 5 個工作:


Id       Name                 State           HasMoreData  HasErrors    Command

--       ----                 -----           -----------  ---------    -------

1        Job1                 Running         False        False        ...

2        Job2                 Running         False        False        ...

3        Job3                 Running         False        False        ...

4        Job4                 Running         False        False        ...

5        Job5                 Running         False        False        ...

然后您可以檢查父進程中的 $sync 并看到它不斷地從這些作業中更新。請注意,這些不僅僅是字符串表示,而是完整的對象。


PS C:\> $sync


Name     Value

----     -----

Time     4/22/2019 11:58:35 AM

Stop     False

Updater  9ab28c51-2941-4866-a064-165b1ceca673


PS C:\> $sync


Name     Value

----     -----

Time     4/22/2019 11:58:37 AM

Stop     False

Updater  113e78a8-1774-4cdf-9638-7235109f0a0d

終止我們設置的作業$sync.Stop = $true


PS C:\> Get-RSJob


Id       Name                 State           HasMoreData  HasErrors    Command

--       ----                 -----           -----------  ---------    -------

1        Job1                 Completed       False        False        ...

2        Job2                 Completed       False        False        ...

3        Job3                 Completed       False        False        ...

4        Job4                 Completed       False        False        ...

5        Job5                 Completed       False        False        ...


查看完整回答
反對 回復 2022-12-24
  • 1 回答
  • 0 關注
  • 107 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號