2012-07-19 45 views
2

我已經得到了我希望用自動化的幾件事情的包裝PowerShell腳本行。這是非常基本的,並且接受一個參數,我希望腳本運行,就好像它是腳本中的一行一樣。我絕對不能讓它工作。執行傳遞到PowerShell腳本參數,就好像它是在腳本

例如:

param([string[]] $p) 
echo $p 
# Adds the base cmdlets 
Add-PSSnapin VMware.VimAutomation.Core 
# Add the following if you want to do things with Update Manager 
Add-PSSnapin VMware.VumAutomation 
# This script adds some helper functions and sets the appearance. You can pick and choose parts of this file for a fully custom appearance. 
. "C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-VIToolkitEnvironment.ps1" 

$p 

在上面的例子中,我想$ p來執行,就好像它是在腳本行。我知道這是不安全的,這可能是問題所在。

這裏是我嘗試運行腳本,並在參數傳遞爲$ P:

D:\ps\test>powershell -command "D:\ps\test\powershell_wrapper.ps1" 'Suspend-VM servername -Verbose -Confirm:$False' 

我怎樣才能讓我的參數「掛起VM服務器名-Verbose -Confirm:$假」運行在我的腳本里面?如果我只是將值包含在腳本中,而不是作爲參數傳入,它將毫無問題地運行...

回答

3

您可以基本上採用這兩種方法,具體取決於您的需求是什麼以及想要如何構造你的代碼。

方法#1 - 調用-表達

Invoke-Expression基本上可以讓你像對待一個表達式的字符串,並對其進行評估。考慮下面的簡單的例子:

Invoke-Expression '{"Hello World"}' 

這將評估字符串就好像它是一個表達式中直接輸入,並把字符串「Hello World」的管道。你可以使用它來獲取你的字符串參數並在你的腳本中實時運行它。

方法2 - 使用腳本塊

PowerShell中有一個叫做腳本塊,在那裏你可以一個腳本綁定到一個變量,然後調用該腳本作爲代碼的一部分特殊的數據類型。同樣,這裏是一個簡單的例子:

function Test-SB([ScriptBlock]$sb) { 
    $sb.Invoke() 
} 

Test-SB -sb {"Hello World"} 

這個例子創建了一個參數$ SB,類型爲腳本塊的功能。注意參數綁定到代碼{"Hello World"}的實際塊?該代碼被分配給$ sb參數,然後調用.Invoke方法實際執行代碼。您可以調整您的代碼以接收ScriptBlock並將其作爲腳本的一部分調用。

方法#3 - 更新您的個人資料

OK,所以我說有兩種方法來處理它。其實還有第三個......之類的......你可以在VMWare的cmdlet的添加到您的$profile所以它們總是存在的,你不需要你的包裝在這些庫加載。當然,這是一個相當大的錘子 - 但它可能是有意義的,如果這是你在不斷努力環境你也可以只創建快捷方式的PowerShell在啓動的時候,包括那些庫和徘徊運行的.ps1(這一點。是MS對SharePoint管理員外殼和其他幾個人所做的)。看看這個TechNet頁面的獲取在$配置文件的詳細信息,如果它可以幫助你:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb613488.aspx

+0

這似乎並不真正是爲我工作 - 當我調用的表情,我只是得到傳遞給屏幕的字符串...做一些Google搜索嘗試並找出這個問題,但可能是在正確的軌道上。很好的解釋btw。 – user797963 2012-07-20 14:53:19

+1

想通了!再次感謝。問題是在我的命令中轉義字符 - powershell與轉義複雜命令討厭。 Invoke-Expression完美運作。 – user797963 2012-07-20 22:38:06