Глава 4. Интерактивный ввод

Данная глава снабдит вас примерами, в которых вы можете добавлять в свои сценарии интерактивный ввод (то есть сам сценарий запросит ввод, например, набор пароля или иного атрибута, такого как путь к файлу CSV или текста).

Read-host

Вы уже применяли Write-host для вывода на печать в своём экране значения. Теперь вы можете воспользоваться Read-host для получения значений, которые пребывают во вводе пользователя с его экрана:


$x =Read-host "input your Name"
 	   

Получаемое из вашего ввода значение сохраняется в переменной $x с тем, чтобы вы могли применять его в своём сценарии для дальнейшей обработки, как это показано на Рисунке 4-1.

 

Рисунок 4-1


Операция Read-host

Другим вариантом является определение использования параметра -prompt. Нет никакой разницы в том как вы применяете это. Посмотрите на Рисунок 4-2.


$x =Read-host "input your Name"
 	   
 

Рисунок 4-2


Операция Read-host, предписывающая -prompt

Когда вы хотите безопасно вводить пароль, применяется -assecurestring:


$Password = Read-Host -assecurestring "Enter your password"
 	   

Здесь значение введённого пароля также сохраняется в переменной $Password, которую вы можете применять в своём сценарии для последующей обработки, например, для аутентификации в какой- либо службе, скажем в Office 365. Смотрите на Рисунок 4-3.

 

Рисунок 4-3


Операция Read-host для пароля в качестве входного параметра

Параметры

В команде PowerShell функции это сценарии, которые полагаются на параметры с тем, чтобы пользователь мог либо вводить значения или выбирать варианты. Я кратко затрону основы параметризации (Расширенные параметры выходят за рамки этой книги). Обратитесь к Листингу 4-1.

 

Листинг 4-1. Пример кода, показывающий применение параметров


Param(
  [string]$firstname,
  [string]$lastname,
  [string]$title
)
Write-host "First Name: $firstname" -ForegroundColor Yellow
Write-host "Last Name: $lastname" -ForegroundColor Yellow
Write-host "Title: $Title" -ForegroundColor green
 	   

Сохраните это в неком файле .ps1 и запустите его следующим образом (и посмотрите на Рисунок 4-4):


.\script.ps1 -firstname Vikas -lastname sukhija -title blogger
		
 

Рисунок 4-4


Исполнение сценария с параметрами

[Совет]Совет

Убедитесь что вы определили параметры в самом начале своего сценария.

Кнопка графического интерфейса

Здесь приводится код шпаргалки (функцию) для того случая, когда вы желаете интерактивно выполнять ввод в определённой форме графического интерфейса пользователя. Я рассматриваю это причудливым вариантом получения сведений от пользователя. Функция кнопки из Листинга 4-2 может получать входные данные из формы Windows, которые вы можете отображать на экране или выполнять другие необходимые операции в своём сценарии.

 

Листинг 4-2. Код для ввода из кнопки графического интерфейса


function button ($title,$mailbx, $WF, $TF)
{
  ###################Загружаем сборку для создания формы и кнопки######
  [void][System.Reflection.Assembly]::LoadWithPartialName( "System.Windows.Forms")
  [void][System.Reflection.Assembly]::LoadWithPartialName( "Microsoft.VisualBasic")
  #####Определяем размер и положение формы
  $form = New-Object "System.Windows.Forms.Form";
  $form.Width = 500;
  $form.Height = 150;
  $form.Text = $title;
  $form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen;
  ##############Определяем текст label1
  $textLabel1 = New-Object "System.Windows.Forms.Label";
  $textLabel1.Left = 25;
  $textLabel1.Top = 15;
  $textLabel1.Text = $mailbx;
  ##############Определяем текст label2
  $textLabel2 = New-Object "System.Windows.Forms.Label";
  $textLabel2.Left = 25;
  $textLabel2.Top = 50;
  $textLabel2.Text = $WF;
  ##############Определяем текст label3
  $textLabel3 = New-Object "System.Windows.Forms.Label";
  $textLabel3.Left = 25;
  $textLabel3.Top = 85;
  $textLabel3.Text = $TF;
  ############Определяем текст box1 для ввода
  $textBox1 = New-Object "System.Windows.Forms.TextBox";
  $textBox1.Left = 150;
  $textBox1.Top = 10;
  $textBox1.width = 200;
  ############Определяем текст box2 для ввода
  $textBox2 = New-Object "System.Windows.Forms.TextBox";
  $textBox2.Left = 150;
  $textBox2.Top = 50;
  $textBox2.width = 200;
  ############Определяем текст box3 для ввода
  $textBox3 = New-Object "System.Windows.Forms.TextBox";
  $textBox3.Left = 150;
  $textBox3.Top = 90;
  $textBox3.width = 200;
  #############Определяем значения по умолчанию для блоков ввода
  $defaultValue = ""
  $textBox1.Text = $defaultValue;
  $textBox2.Text = $defaultValue;
  $textBox3.Text = $defaultValue;
  #############Определяем кнопку OK
  $button = New-Object "System.Windows.Forms.Button";
  $button.Left = 360;
  $button.Top = 85;
  $button.Width = 100;
  $button.Text = "Ok";
  ############# Именно здесь мы закрываем форму после получения значений
  $eventHandler = [System.EventHandler]{
    $textBox1.Text;
    $textBox2.Text;
    $textBox3.Text;
    $form.Close();
  };
  $button.Add_Click($eventHandler) ;
  #############Добавляем управление для всех определённых выше объектов
  $form.Controls.Add($button);
  $form.Controls.Add($textLabel1);
  $form.Controls.Add($textLabel2);
  $form.Controls.Add($textLabel3);
  $form.Controls.Add($textBox1);
  $form.Controls.Add($textBox2);
  $form.Controls.Add($textBox3);
  $ret = $form.ShowDialog();
  #################возвращаем значения
  return $textBox1.Text, $textBox2.Text, $textBox3.Text
} #button
 	   

Загружаем эту функцию в ваш сценарий и затем вы можете выполнять необходимые свои операции по вводу как показано здесь:


$return= button "Enter Folders" "Enter mailbox" "Working Folder" "Target Folder"
		

Вы можете выбирать различные названия для своих требований. Обратите внимание на Рисунок 4-5.

 

Рисунок 4-5


Ввод кнопкой графического интерфейса

После того как вы нажмёте кнопку OK, ваша переменная $return содержит все эти значения в своём массиве (смотрите Рисунок 4-6):


$return[0] → Enter mailbox value
$return[1] → Working folder value
$return[2] → Target Folder value
		
 

Рисунок 4-6


Отображение значений, возвращённых из ввода пользователя

Вы также можете вывести на печать своего экрана точно также как это показано ранее (смотрите Рисунок 4-7):


Write-host "Enter mailbox : $($return[0])" -ForegroundColor Yellow
Write-host "Working folder : $($return[1])" -ForegroundColor Yellow
Write-host "Target Folder : $($return[2])" -ForegroundColor green
		
 

Рисунок 4-7


Вывода на печать значений с применением Write-host

Приглашение на ввод (Yes или No)

Встречаются практические ситуации когда вам в качестве системного администратора желательно построить симпатичный способ получения отклика Yes/No от своих пользователей. Вы можете запросто выполнять это в PowerShell применяя код шпаргалки из Листинга 4-3.

 

Листинг 4-3. Код для операции Yes/No


$overwrite = New-Object -comobject wscript.shell

$Answer = $overwrite.popup("Do you want to Overwrite AD Attributes?",0,"Overwrite Attributes",4)

If ($Answer -eq 6) {Write-Host "you pressed Yes" -ForegroundColor Green}
else{Write-Host "you pressed Yes" -ForegroundColor Red}
 	   

Скопируйте этот код и вставьте его в свою консоль PowerShell или сохраните этот сценарий в качестве файла .ps1и исполните его. Смотрите Рисунок 4-8.

 

Рисунок 4-8


Отображение операции Yes/No в PowerShell

Когда вы наживаете Yes, вы получаете результат, отображаемый на Рисунке 4-9.

 

Рисунок 4-9


Отображение значения Yes операции

Если вы наживаете No, вы получаете результат, показанный на Рисунке 4-10.

 

Рисунок 4-10


Отображение значения No операции

Вместо простого Write-host вы можете внутри своего сценария выполнять другие операции на основании получаемого отклика, выбираемого вашим пользователем.

Выводы

В этой главе вы изучили интерактивные входные данные. Данная стратегия применяется когда вам приходится предоставлять свой сценарий некоторому конечному пользователю. Сам конечный пользователь должен запускать этот сценарий. Создатель сценария кодирует те вопросы, которые интерактивно всплывают и конечный пользователь может отвечать на них и выполняется содержательное задание.