запуск самописной программы .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") } Не работает, не понимаю как решить. Есть предложения или примеры решения аналогичных проблем? |
Вложений: 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-