2011-11-27 45 views
3

我對Powershell腳本非常陌生。如何在Powershell腳本中編寫此代碼?

我試圖從一個cmd

powershell.exe Set-ExecutionPolicy Unrestricted 
powershell.exe .\startup.ps1 

我需要PowerShell腳本中的兩條線運行PowerShell腳本。

%WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated" 

%WINDIR%\system32\inetsrv\appcmd.exe set app "WebRole_IN_0_VC/" /applicationPool:"VCPool" 

我可以在ps1文件中這樣寫嗎?

& %WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated" 

非常感謝

回答

12

簡短的回答,包括一個問題:爲什麼這樣做需要成爲一個PowerShell腳本?

你可以簡單地創建一個包含

%WINDIR%\system32\inetsrv\appcmd.exe add apppool /name:"VCPool" /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Integrated" 
%WINDIR%\system32\inetsrv\appcmd.exe set app "WebRole_IN_0_VC/" /applicationPool:"VCPool" 

一個批處理文件並運行的,而不是直接試圖找出執行政策等

此外,appcmd應該可能在你PATH,所以你可以直接運行它而不需要指定程序的完整路徑。


較長的答案,實際使用PowerShell的:這裏有兩個問題。

  1. 想要在沒有設置適當的執行策略的情況下運行PowerShell腳本。這可以用

    powershell -ExecutionPolicy Unrestricted -File myscript.ps1 
    
  2. 您需要調整PowerShell腳本中的環境變量的使用來實現,如%不是用來擴大環境變量存在。所以,你真的需要

    & $Env:WinDir\system32\inetsrv\appcmd.exe add apppool /name:VCPool /managedRuntimeVersion:v4.0 /managedPipelineMode:Integrated 
    & $Env:WinDir\system32\inetsrv\appcmd.exe set app WebRole_IN_0_VC/ /applicationPool:VCPool 
    

    還請注意,您在一行的開頭每一行作爲一個變量名前需要一個符號(&)切換到表達模式當你想運行一個命令,因此需要命令模式

    此外,引用的參數在PowerShell中可能有點痛苦。 PowerShell會在必要時嘗試引用參數,當事情出錯時,實際出現的問題並不總是顯而易見。在這種情況下,最簡單的方法是不報價參數以任何方式whcih確保他們正確輸出:

    PS Home:\> args add apppool /name:VCPool /managedRuntimeVersion:v4.0 /managedPipelineMode:Integrated 
    argv[1] = add 
    argv[2] = apppool 
    argv[3] = /name:VCPool 
    argv[4] = /managedRuntimeVersion:v4.0 
    argv[5] = /managedPipelineMode:Integrated 
    
    PS Home:\> args set app WebRole_IN_0_VC/ /applicationPool:VCPool 
    argv[1] = set 
    argv[2] = app 
    argv[3] = WebRole_IN_0_VC/ 
    argv[4] = /applicationPool:VCPool 
    

    然而,如果appcmd實際上需求周圍參數報價冒號後,再您需要單引號引述整個論證,並添加雙引號回:

    & $Env:WinDir\system32\inetsrv\appcmd.exe set app WebRole_IN_0_VC/ '/applicationPool:"VCPool"' 
    
+0

喬伊,非常感謝你這很好的一步一步指導。它現在有效。 – Houman

0

你可能想知道你可以在CMD文件中的兩個發射語句組合成一個單一的電話:

powershell.exe -noprofile -executionpolicy unrestricted -file .\startup.ps1 

唯一有關調用APPCMD稍微奇怪的事情。 EXE從PowerShell是你必須包圍參數引號,即使它不包含空格。你已經這樣做了,所以是的,它應該工作。