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

Ще използвам за всеки цикъл за около 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
Най-вече търсех алтернативен GUI за пълен на VB, което може да бъде повече болка, отколкото си струва, поиграх си с някои уроци HTA за VBScript и харесах гъвкавостта и лесната крива на обучение, които предлагаха, дори Powershell posterboy на Ed Wilson MS препоръчва използването им за скриптове на powershell blogs.technet.com/b/heyscriptingguy/archive/2009/08/31/, ако има по-добър начин, не се колебайте да насочи ме в тази посока   -  person Matt Hamende    schedule 04.04.2012


Отговори (2)


Мисля, че тази минимална ОЗТ ще реши проблема ви. Той изпълнява команден ред и чете изходния поток, един ред на всеки 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