Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] запуск самописной программы .exe с параметрами (http://forum.oszone.net/showthread.php?t=332155)

AlexeyMakarov 27-12-2017 10:47 2787317

запуск самописной программы .exe с параметрами
 
Добрый день. коллеги, написал маленькие функции на powershell, через SAPIEN нарисовал форму и скомпилировал из своего кода программу: USERLIST.exe Суть проблемы в том, что я хочу например положить эту програмку в каталог: C:\Windows\System32 и юзать через cmd с параметрами, аналогично программам gpupdate, ipconfig (можно взять любую прграмму)
По факту получаеться, что у меня есть функция:
function GPReport
{
$UserName = $env:USERNAME
$Computername = $env:COMPUTERNAME
$reportlist = "c:\temp\USERLIST\GPReport$Computername$UserName.html"

#Блок кода, отвечающий за формирование отчета
if (Test-Path $reportlist)
{
#Удалаяем старую версию выгрузки отчета GPReport
Remove-Item -Path $reportlist
}

#Запустили формирование отчета GPReport в каталоге USERLIST, этот элемент из-за такой конструции воспринимаеться как строка: -ArgumentList "/H c:\temp\USERLIST\GPReport$Computername$UserName.html"
start-process -FilePath 'C:\Windows\System32\gpresult.exe' -ArgumentList "/H c:\temp\USERLIST\GPReport$Computername$UserName.html" -WindowStyle Hidden

#Если путь найден, то выходим из цикла $reportlist
while ($true)
{
if (Test-Path $reportlist) { break }
}
#Задержка
Start-Sleep 30
}

работу этой функции в стандартных условиях я передаю на выполнение в кнопку: $buttonGPReport_Click = { GPReport }

Но теперь я хочу, чтобы можно было выполнить её черерз cmd, как обычную виндовую программку с параметром, например так: USERLIST /GPReport
причем я не могу понять сам принцип работы. В первых 14 строках кода я написал так, но не могу понять что не так:

param (
[Parameter(Mandatory = $true)][string[]] $Command # это сравниваем, если равна ** тогда делаем **
#[Parameter(Mandatory = $false)][string[]] $copymail #второй адресат, не обязательный
)

if ($Command -eq "")
{
#[void][reflection.assembly]::Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
[void][System.Windows.Forms.MessageBox]::Show("пусто", "Caption")
}
else
{
[void][System.Windows.Forms.MessageBox]::Show("$buttonGPReport_Click", "Caption")
}


Не работает, не понимаю как решить. Есть предложения или примеры решения аналогичных проблем?

AlexeyMakarov 29-12-2017 07:30 2787876

Вложений: 1
Решил вопрос следующим образом:
В листинге MainForm.psf оставил только ссылки на функции:
Скрытый текст

$OnLoadFormEvent={
}

$button1_Click={
GPReport
}

$button2_Click={
Zamexe
}


В листинге Globals.ps1 оставил всё как было сгенерировано оболочкой:

Скрытый текст

function Get-ScriptDirectory
{
<#
.SYNOPSIS
Get-ScriptDirectory returns the proper location of the script.
.OUTPUTS
System.String
.NOTES
Returns the correct path within a packaged executable.
#>
[OutputType([string])]
param ()
if ($hostinvocation -ne $null)
{
Split-Path $hostinvocation.MyCommand.path
}
else
{
Split-Path $script:MyInvocation.MyCommand.Path
}
}
[string]$ScriptDirectory = Get-ScriptDirectory


По факту изменениями занимался в листинге: Startup.pss

Для примера оставил только 1 функцию для кнопки:GPReport:

Скрытый текст

function GPReport
{
$UserName = $env:USERNAME
$Computername = $env:COMPUTERNAME
$reportlist0 = Get-Date -Format "yyMMddhhmm"
$reportlist = "c:\temp\USERLIST\GPReport_$($reportlist0)_$($Computername)_$($UserName).html"

if (Test-Path $reportlist)
{
Remove-Item -Path $reportlist
}
start-process -FilePath 'C:\Windows\System32\gpresult.exe' -ArgumentList "/H $($reportlist)" -WindowStyle Hidden

while ($true)
{
if (Test-Path $reportlist) { Start-Sleep 5; break }
Start-Sleep 1 #Задержка
}
}


И уже функцию GPReport вызвал черерз системную функцию Main, данная функция была создана автоматически при создании проекта, она и отвечает за вызов (запуск) формы проекта, в этой функции добавил всего 1 строку: if ($Commandline.Trim('"') -eq "/GPreport") { GPreport } конечный вид функции такой:

Скрытый текст

function Main {

Param ([String]$Commandline)
$fpath = "C:\TEMP\USERLIST"

$isfile = Test-Path $fpath
if ($isfile -eq "True") { }
else
{
New-Item -Path 'C:\TEMP' -Name 'USERLIST' -ItemType "directory"
}

#Проверка на наличие директории $fpath
if (!(Test-Path $fpath))
{
Write-Host "Не найдена директория $fpath"

[System.Windows.Forms.MessageBox]::Show("НЕ НАЙДЕНА ДИРЕКТОРИЯ $($fpath)",
"ОШИБКА", [System.Windows.Forms.MessageBoxButtons]::OK,
[System.Windows.Forms.MessageBoxIcon]::Warning) | Out-Null
exit
}
# Строка 105 являеться парметром для приложения USERLIST2.exe /GPreport, т.е. Если из каталога запустить ПО USERLIST2
# и задать ключ, команда отработает, если просто задать USERLIST2, запустится визуальная форма
if ($Commandline.Trim('"') -eq "/GPreport") { GPreport }

else
{
if ((Call-MainForm_psf) -eq "OK")
{

}
}
$global:ExitCode = 0 #Set the exit code for the Packager
}


Таким образом получил возможность вызывать черерз cmd программу userlist.exe и вызывать из userlist нужные мне функции. Кому интересно, прикладываю рабочий пример, только в примере я второй кнопкой вызываю программу: zam.exe По аналогии можно заменить её на что угодно.


Время: 10:17.

Время: 10:17.
© OSzone.net 2001-