2016-11-10 36 views
7

我有一個調用另一個腳本(帶參數)的腳本。被調用的腳本包含Install-WindowsFeature cmdlet。當我運行該腳本,被調用的腳本運行,但返回以下錯誤:從被調用的腳本運行cmdlet的Powershell

Install-WindowsFeature : The term 'Install-WindowsFeature' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path 

當然,我可以運行該cmdlet從PowerShell控制檯就好了。我也可以從PowerShell控制檯運行被調用的腳本,Install-WindowsFeature工作正常。那麼,是否需要從運行cmdlet的腳本調用腳本?這裏是我的調用代碼:

$script = "C:\Path\script.ps1" 
$argumentList = @() 
$argumentlist += ("-Arg1", "value") 
$argumentlist += ("-Arg2", "value") 
$argumentlist += ("-Arg3", "value") 
Invoke-Expression "$script $argumentList" 

在調用的腳本,我下面叫Install-WindowsFeature

if ($someValue) { Invoke-Command -ScriptBlock {Install-WindowsFeature -Name RSAT-AD-Tools} } 

我也試了一下,如下:

if ($someValue) { Install-WindowsFeature -Name RSAT-AD-Tools } 

12/16/16編輯:此腳本運行在使用Sapien PowerShell Studio構建的GUI中。當我將構建類型更改爲「本機」時,它可以工作。我必須重置我的實驗室來檢查,但我懷疑它也會運行,如果我只是在x64上下文中運行它。文章解釋了爲什麼我認爲這很重要。

運行Windows Server 2012 R2

+0

以管理員身份運行?或者可能提供憑據來運行它? Invoke-Command -Credential – Kage

+0

@Kage我也嘗試過。不知道該cmdlet是否不可見,或者是否會導致拒絕訪問錯誤,但行爲是相同的,無論如何。 – McKenning

+0

您是否曾嘗試在if語句之前的script.ps1中運行'import-module servermanager'? –

回答

2

運行環境決定您有權訪問哪些模塊。當我在PowerShell Studio中創建該項目時,它使用x86(32位環境)的默認值。這很有效,但是因爲我在Windows Server 2012 R2(64位環境)上運行它,所以我沒有權限訪問PowerShell模塊,例如Import-Module和Install-WindowsFeature。將其更改爲x64項目解決了我的問題。

爲了避免出現這種情況,確保在操作系統本機的體系結構中運行PowerShell腳本和模塊非常重要。您可以通過正確設置項目(如果使用PowerShell Studio等工具)或通過Martin Brandl提供的代碼驗證您是以該操作系統的本機模式運行來實現此目的。

2

你可能是正確的,它看起來像腳本獲取與 PowerShell的執行。我想與你分享一個片段,我用它來編寫需要在特定環境(例如x64 PowerShell)中運行的腳本。

在的PowerShell重新啓動本身如果開始是86過程中的腳本。只要把這個在你的腳本的頂部:

# Reinvoke the script as x64 if its called from a x86 process. 
if ($env:Processor_Architecture -eq "x86") 
{ 
    &"$env:windir\sysnative\WindowsPowerShell\v1.0\powershell.exe" -noprofile -file $myinvocation.Mycommand.path -executionpolicy bypass 
    exit 
} 

還要注意的是Install-WindowsFeature cmdlet不會在所有的Windows版本的工作,所以考慮使用dism代替:

$featuresToInstall = @('RSAT-AD-Tools') 

$dismParameter = @('/online', '/Enable-Feature', ($featuresToInstall | % { '/FeatureName:{0}' -f $_ }), '/NoRestart') 
dism @dismParameter 
+0

在Install-WindowsFeature之前,有'Add-WindowsFeature'(用於Windows Server 2008 R2)。使用'dism'只適用於Windows Server 2008及更早版本,這些都不受支持。如果你需要的話,這很好,但對於大多數環境,Install-WindowsFeature應該沒問題。特別是在推動越來越多PowerShell cmdlet的情況下,'dism'實際上可能會成爲未來版本中的渡渡鳥。 –

+0

@JeroenMostert在Windows 10中,沒有'Install-WindowsFeature' cmdlet,而是一個'Enable-WindowsOptionalFeature'。這就是爲什麼我更喜歡使用dism--它是安裝特徵的最可靠的工具(以我的經驗)。 –

+0

對不起,沒有考慮客戶端操作系統(我只管理跳轉服務器)。你甚至可以在Windows 10上安裝'RSAT-AD-Tools'嗎? –

3

除非你我們已經有了一個令人信服的理由,讓我們看看我們是否可以稍微清理一下你的通話模式 - 並希望通過避免扭曲現象來讓你的其他問題消失。

與其將參數列表創建爲字符串,請利用parameter splatting。像其他腳本語言一樣對待PowerShell的習慣是很好的,這些腳本語言不適用於對象。

$splat = @{ 
    Arg1 = "value1"; 
    Arg2 = "value2"; 
    Arg3 = "value3" 
    } 

& c:\path\script.ps1 @splat 

在腳本上使用它。PS1是這樣的:

param(
    $Arg1, 
    $Arg2, 
    $Arg3 
) 

Write-Host "Arg1 = $Arg1, Arg2 = $Arg2, Arg3 = $Arg3 

你會得到的預期輸出:

Arg1 = value1, Arg2 = value2, Arg3 = value3 

一旦你得到了,可能沒有理由使用在調用調用命令Install-WindowsFeature,除非你遺漏了遠程調用服務器等細節。 Invoke-Command {Install-WindowsFeature}對於使用PowerShell 5的Server 2012R2,我仍然可以正常工作,並且沒有理由不應該這樣做。

這裏假定您在支持安裝WindowsFeature的服務器上運行此腳本,正如其他評論指出的那樣。客戶端Windows不支持Install-WindowsFeature,並且RSAT工具通過獨立的RSAT .MSU軟件包進行安裝,您對此進行了不同的管理。

安裝-WindowsFeature天然地提供與服務器2012R2服務器管理器 - 有沒有必要導入模塊 ...除非你已經做了一些你的個人資料或搞砸了你的模塊文件夾。 Windows Server的早期版本之一需要它 - 但這是一個版本。同樣,Add-WindowsFeature是舊名稱 - 它仍然可用作Install-WindowsFeature的別名。

我假設你已經試過安裝-WindowsFeature直接在命令行,以確保它的工作秩序,並獲取-模塊安裝-WindowsFeature看起來是合理的。

PS C:\Windows\system32> get-module ServerManager 

ModuleType Version Name        ExportedCommands 
---------- ------- ----        ---------------- 
Script  2.0.0.0 ServerManager      {Get-WindowsFeature, Install-WindowsFeature, Uninstall-Win... 

雖然我們的話題,有很少的原因下降到DISM服務器上支持安裝-WindowsFeature,而不是一些原因。

  1. 服務器管理器和其他一些工具(包括Win32_ServerFeature)依靠功能狀態分析,並通過安裝-WindowsFeature使用WMI提供程序的理解。它是可能使用DISM啓用正確的一組功能,但需要注意和細節。僅啓用角色和功能的「部分」可能會獲得特定情況下的功能,但該角色或功能可能不會顯示爲安裝在Get-WindowsFeature中,可能無法通過Remove-WindowsFeature進行卸載,並且可能不會提供相關的功能服務器管理器中的UI功能,如監視角色的健康狀況,查看相關事件或提供管理它的工具。

  2. Install-WindowsFeature與您正在安裝的角色&功能的其他代碼集成,並且可能會運行其他運行狀況和先決條件檢查以確保您的配置正確。

  3. DISM功能名稱往往會比服務器管理器的角色&功能名稱更經常更改,因此您的腳本可移植性會更好。
    還有其他一些觀點,但我不會深究他們,因爲DISM主要是評論分支。
+0

我是Install-WindowsFeature的開發經理,所以你遇到的麻煩讓我感到驚訝。我檢查一下,看看我們可以做些什麼來讓你整理出來。 –

+1

你好馬修。感謝您對此發出指示。只是爲了澄清,Install-WindowsFeature可以在命令提示符下正常工作。只有在x32模式下運行腳本時纔會中斷(因爲x64可以正常工作)。當Import-Module不起作用時,我被提到了這一點。另外,我同意DISM更像是一個傳統工具,Install-WindowsFeature更可取。 – McKenning

+0

我認爲它確實如此 - 通過簡化您的調用模式,您可以避免在x86進程中結束,或者至少減少運動部件,並使出現的任何問題更加明顯。 :) –

相關問題