2014-01-25 91 views
1

我有一個PowerShell腳本p1.ps1看起來像這樣(不完全,但是這會做爲例):如何自動運行提示用戶界面選擇的PowerShell腳本?

$yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Do the action." 
$no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Exit." 
$options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no) 
$result = $host.ui.PromptForChoice($title, $message, $options, 1) 

我怎麼能寫另一個腳本p2.ps1,將運行第一個(p1.ps1),併爲其提供對提示的回答,以便p2.ps1在沒有詢問的情況下執行?

我曾嘗試:

echo y | p1.ps1 

但它不會做的伎倆。

回答

9

$host.ui.PromptForChoice()正在與主機進行交互,而不是與管道的輸出流進行交互。我沒有意識到自動化主機提示的方法。

一個清潔的解決辦法是增加一個-Force開關p1.ps1

[CmdletBinding()] 
Param(
    [switch]$Force = $false 
) 

與製作,開關覆蓋提示:

if (-not $Force) { 
    $yes = New-Object System.Management.Automation.Host.ChoiceDescription ... 
    $no = New-Object System.Management.Automation.Host.ChoiceDescription ... 
    $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no) 
    $result = $host.ui.PromptForChoice($title, $message, $options, 1) 
} else { 
    $result = 0 
} 

這樣,當你運行將不顯示提示這樣的腳本:

./p1.ps1 -Force 
+0

如果他需要能夠強制另一個結果值,他可以添加一個ParameterSet,它接受'-Force'和其他參數來定義提示通常會給出的值。 :) –

+0

那麼這是絕對的備份選項,如果我沒有設法提供腳本的答案。我想正確解決它,因爲我想自動執行所有答案的測試(是,否,幫助,FooBar)。 –

1

根據如何喲你正在產生腳本,powershell sendkeys可以做到這一點。

[void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') 
[System.Windows.Forms.SendKeys]::SendWait("Y") 
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}") 

注意事項,如果腳本運行隱藏的,它不會工作,因爲我們不能給的SendKeys無形窗口。當我們發送「Y + ENTER」命令時,我們可能需要在第一個腳本窗口中添加一行或兩個焦點到第一個腳本窗口。

+0

其實,因爲我用powershell.exe運行它沒有窗口,而是「命令行」的Y/N問題。 –

+0

要更改焦點使用'[void] [System.Reflection.Assembly] :: LoadWithPartialName(「'Microsoft.VisualBasic」) [Microsoft.VisualBasic.Interaction] :: AppActivate(「Test.ps1 - 記事本」)ref: https://technet.microsoft.com/en-us/library/ff731008.aspx – ShawnFeatherly

相關問題