2015-07-21 103 views
4

我創建調用PowerShell腳本script.ps1需要導入Active-Directory模塊的Python腳本重新導入模塊。然而,我每次運行使用 check_output('powershell.exe -File script.ps1') 它需要重新導入Active Directory模塊script.ps1的每次運行,這使得運行時間花費約3秒的時間,然後它需要的PowerShell腳本。在Python運行PowerShell腳本,而不在每次運行

我想知道的話,如果有,以保持進口PowerShell的模塊的方式(就好像直接從Powershell的跑,而不是從Python的),這樣我可以使用的東西像

if(-not(Get-Module -name ActiveDirectory)){ 
    Import-Module ActiveDirectory 
} 

加快執行時間。

+0

什麼版本的PowerShell的? – briantist

+0

你可以做的「主機配置文件」加載它時,PowerShell是加載 – Luke

+0

@Luke不會保存任何時間,雖然,這是該規定的目的。您只需更改每次輸入模塊的位置。 – briantist

回答

5

此解決方案使用PowerShell遠程,並且要求機器你遠程入具有ActiveDirectory的模塊,並且它要求機器使得遠程連接(客戶端)是PowerShell的3或更高的版本。

在此示例中,機器的遙控器到自身。

這將是您的script.ps1文件:

#requires -Version 3.0 

$ExistingSession = Get-PSSession -ComputerName . | Select-Object -First 1 

if ($ExistingSession) { 
    Write-Verbose "Using existing session" -Verbose 
    $ExistingSession | Connect-PSSession | Out-Null 
} else { 
    Write-Verbose "Creating new session." -Verbose 
    $ExistingSession = New-PSSession -ComputerName . -ErrorAction Stop 
    Invoke-Command -Session $ExistingSession -ScriptBlock { Import-Module ActiveDirectory } 
} 

Invoke-Command -Session $ExistingSession -ScriptBlock { 
    # do all your stuff here 
} 

$ExistingSession | Disconnect-PSSession | Out-Null 

它需要的PowerShell的爲斷開的會話支持的優勢。每當您掏出PowerShell.exe時,最終都會連接到已加載ActiveDirectory模塊的現有會話。

一旦你所有的調用來完成的,你應該銷燬會話:

Get-PSSession -ComputerName . | Remove-PSSession 

這與在每次運行一個獨立的powershell.exe調用測試。

我不知道是否延遲的原因實際上是因爲加載了ActiveDirectory模塊,或者至少有一部分延遲是由於必須加載PowerShell.exe本身而引起的。

+0

剛剛在錯過原始複製/粘貼的最後一行代碼中編輯;這很重要!如果您不斷開會話,則會在本地會話關閉時將其刪除。 – briantist

+1

不錯的橫向思維。+1 – gymbrall

+0

不幸的是,這不適用於Powershell v2,但它是一個很好的解決方案。我想知道是否有可能通過使用Python重新連接到現有的Powershell會話來在Python中做類似的事情(這很遺憾,不適用於Windows) –