Запись HTA в ‹span› из текстового файла

Я пытаюсь записать данные из текстового файла в HTA.

Я запускаю сценарий powershell внутри HTA, используя VBscript для кнопок ввода.

Get-TSSession -computername ismeta | where { $_.username -eq 'amis5235'} | format-table windowstationname,username,state,sessionid | out-file C:\windows\temp\PSTerminalServices.txt

Я собираюсь использовать цикл for each примерно для 60 серверов.

Затем я надеялся записать вывод в HTA, что-то вроде стримера в VB или складывания строки в VBscript, что-то вроде:

strHTML = strHTML & "Running Process = " & objProcess.Name & " PID = " & objProcess.ProcessID & " Description = " & objProcess.Description & "<br>"

но, кажется, должен быть более простой способ сделать это.


person Matt Hamende    schedule 02.04.2012    source источник
comment
Я не очень понимаю ваш вопрос. Вы не можете сгенерировать строку ‹span›‹/span› из poweshell? Почему вы используете HTA, а не Windows Forms для пользовательского интерфейса в PowerShell?   -  person JPBlanc    schedule 03.04.2012
comment
В основном я искал альтернативный графический интерфейс для полного VB, который может быть более болезненным, чем он того стоит, я поиграл с некоторыми учебными HTA для VBScript, и мне понравилась гибкость и простая кривая обучения, которые они предлагали, даже плакат Powershell Эда Уилсона MS рекомендует использовать их для сценариев PowerShell blogs.technet.com/b/heyscriptingguy/archive/2009/08/31/ , если есть лучший способ, не стесняйтесь указать мне в этом направлении   -  person Matt Hamende    schedule 04.04.2012


Ответы (2)


Я думаю, что эта минимальная HTA ​​решит вашу проблему. Он запускает командную строку и считывает поток вывода, по одной строке каждые 1/10 секунды, а затем помещает результаты в текстовое поле. Возможно, вы захотите изменить свой сценарий Powershell, чтобы вернуть сведения о процессе в STDOUT, но, вероятно, это сработает.

<script language="Javascript">
var E, LineWriteTimerID
function execWithStatus(cmdLine){//Can't run minimized with Exec. Can't capture StdOut/StdErr with Run. 
    E = new ActiveXObject("WScript.Shell").Exec(cmdLine);
    LineWriteTimerID = window.setInterval("writeOutLine()",100);//pause for 100ms
    E.StdIn.Close();//must close input to complete a ps command    
}
function writeOutLine(){
    if(E.StdOut.AtEndOfStream) window.clearTimeout(LineWriteTimerID);
    if(!E.StdErr.AtEndOfStream) txtResults.value += "ERROR: " + E.StdErr.ReadAll() + "\n";
    if(!E.StdOut.AtEndOfStream) txtResults.value += E.StdOut.ReadLine() + "\n";
}
</script>
<textarea id=txtCmd style="width:90%" rows=1>
powershell.exe -noninteractive -command ls c:\windows\system32\drivers\etc\</textarea> 
<button onclick="execWithStatus(txtCmd.value)">Run</button>
<br><textarea id=txtResults style="width:100%" rows=20></textarea> 

Сохраните этот код как файл .HTA, измените содержимое текстовой области txtCmd на командную строку и попробуйте. Удачи!

person Rich    schedule 10.05.2012

Хорошо Вот как я использую.

С теоретической точки зрения это состоит в построении интерфейса с Windows Forms и последующем добавлении кода PowerSell за событием.

С технической точки зрения два решения:

1) Используйте бесплатную версию Visual Studio для создания интерфейса на C#, а затем инструмент преобразования для создания связанного источника PowerShell (французская статья здесь)

2) вы можете бесплатно скачать (нужно только зарегистрироваться) Sapiens PrimalFormsCE.exe (Community Edition)

загрузка PrimalFormsCE

Этот инструмент позволяет вам создать форму, а затем сгенерировать ассоциированный код Powershell.

Изображение PrimalFormsCE

Вы также можете создавать формы из краха, вот пример кода:

Add-Type -AssemblyName system.Windows.Forms

# Create the form
$form = New-Object Windows.Forms.Form
$form.Text = "Test Saisie"
$form.Size = New-Object System.Drawing.Size(250,154)

# Create EntryFiel
$TB_Saisie = New-Object System.Windows.Forms.TextBox
$TB_Saisie.Location = New-Object System.Drawing.Point(50,31)
$TB_Saisie.Size = New-Object System.Drawing.Size(150,32)

# Create "Ok" Button
$PB_Ok = New-Object System.Windows.Forms.Button
$PB_Ok.Text = "Ok"
$PB_Ok.Location = New-Object System.Drawing.Point(50,62)
$PB_Ok.Size = New-Object System.Drawing.Size(50,32)
$PB_Ok.DialogResult = [System.Windows.Forms.DialogResult]::OK

# Create "Cancel" Button
$PB_Cancel = New-Object System.Windows.Forms.Button
$PB_Cancel.Text = "Cancel"
$PB_Cancel.Location = New-Object System.Drawing.Point(150,62)
$PB_Cancel.Size = New-Object System.Drawing.Size(50,32)
$PB_Cancel.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
# Add controls to the form
$form.Controls.Add($PB_Ok)
$form.Controls.Add($PB_Cancel)
$form.Controls.Add($TB_Saisie)

# Message loop
$Res = $form.ShowDialog()
If ($Res -eq [System.Windows.Forms.DialogResult]::OK)
{
  Write-Host ("Accepted : {0}" -f $TB_Saisie.Text)
}
else
{
  Write-Host "Cancel"
}
person JPBlanc    schedule 04.04.2012
comment
выглядит очень похоже на VB6, я проверю, спасибо, хотя я все еще думаю, что можно сделать то, о чем я прошу, по крайней мере, согласно MS, просто нет хорошего примера - person Matt Hamende; 05.04.2012