65.9K
CodeProject 正在变化。 阅读更多。
Home

一个 PowerShell 表单生成器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2014年5月7日

CPOL

5分钟阅读

viewsIcon

36147

downloadIcon

165

一个 PowerShell 表单生成器。

引言

本文是对前一篇文章的演进,它不仅考虑了包的实现,尤其是一种新的范式,用于指定表单对象;本文无意对产品进行详尽的解释,请参考附带的文档。

凭借在表单生成器方面多年积累的经验(请在此处 查看列表),我希望已经实现了一个更精简的包结构以及对表单对象更简单的描述。

脚本在 Windows 11 上使用 Powershell 版本 7.3.7 开发。

使用程序

脚本 formgen.psm1 包含 formGen 函数,调用该函数会生成一个表单并返回 fGen 对象。

formGen 使用以下参数调用

  • Widgets:一个必填字符串,包含控件描述列表;
  • CallBack function:一个函数,在表单关闭时接收表单中的数据;
  • Background:表单的可选背景颜色。
PS C:\Sviluppo\PowerShell> using module .\formgen.psm1
PS C:\Sviluppo\PowerShell> $parm = @"
Form '' dialog
Text psw Password password
Text repeatPassword '' password
Text mail
cmb Language '' IT=Italian,FR=French,EN=English,SP=Spanish value FR
Chk check '' 'Consent send info'
Control psw -eq repeatPassword 'Passwords not equals'
"@
PS C:\Sviluppo\PowerShell> $d = formgen $parm -background cyan
PS C:\Sviluppo\PowerShell> $d.fg_data
Name           Value
psw            EllenikePoliteia
mail           ellen@delfi.gr
Language       FR
check          On  
fg_form
fg_button      fg_Ok
repeatPassword EllenikePoliteia

每个控件或控件描述都以空格分隔的属性列表为特征,顺序如下:
TypeField Name、 Field LabelExtra(s)。每个描述都从新的一行开始。

Extra 字段由单个参数或参数值对组成,有些对所有或几乎所有控件都通用,例如 DefaultToolTipCall function [parameter] 等… 其他的则特定于控件,例如 After widgetCenterColorFormat

此外,其他信息,称为伪类型,具有略微不同的语法,它们用于,除其他外,改进表单的呈现和数据控件。

程序会插入按钮:OkResetCancel;但是,如果只有一个控件,则不会显示任何按钮,因为对该项的选择或录入项会退出表单。

关闭表单时,全局变量 $fg_data(一个哈希表,键是控件名)包含输入的数据,外加一个键 fg_button,值为 clicked 按钮的名称;还有 fg_Startfg_End 用于计时;然而,如果按下了取消按钮,则只有 fg_Startfg_Endfg_button

控件

  • 按钮
  • 注释
  • 复选框
  • 列表
  • Menu
  • 单选按钮
  • 文本字段,即文本、密码、文件、日期、受保护字段…
  • 计时器
  • 滑块

对于文本、密码或复选框类型的控件,没有特别需要说明的地方。ListsCombosRadioButtons 的项数据包含在 extra 字段中,每个项之间用逗号分隔;每个项都可以有一个可能的,如果选中该项,则会返回该键。

伪类型

这也许是最有趣的部分,因为伪类型,如前所述,它们与表单的呈现(WindowLabel)或事件管理(EventGetTimer)或数据验证(ControlRequired)有关。

数据控件

Control 命令可以执行字段与常量之间的比较操作,或通过正则表达式进行形式检查,而 Required 命令则强制要求数据的存在。

控件在表单关闭时发生。

T wTime 'Waiting time' Numeric Width 100
Control wTime -gt 0 'Waiting time must be greater 0'
Control wTime -le 1000 'Waiting time too long'
Text e_mail Mail
Control e_mail is mail 'Incorrect mail form'
Slider Min 'Min pressure' From 30 To 150
Slider Max 'Max pressure' From 40 To 220
Control Min -lt Max 'Minimum must be less of Maximum'
T Password '' Password
Control Password is '(?=.*\d)(?=.*[a-z]).{8,}' 'Almost eight character one numeric'
Required e_mail Password wTime

表单呈现

Window 命令,或别名 Form,可以提供标题、背景颜色、屏幕位置和模式(对话框和永久);Label 命令可以为标签着色并右对齐。

按钮、复选框和注释可以放置在另一个控件之后。

事件管理

几乎所有控件都可以包含一个调用参数,该参数与控件上的事件相关联,会调用一个函数(或启动一个 Internet 事务);相关事件是控件最常见的事件:按钮的 Click,文本的 KeyDown 配合 Enter 键…
可以通过 Event 命令设置其他事件;在下面的示例中,LostFocus 事件会在字段失去焦点时(以及表单提交时)调用对该字段的控件。

Window Controls background #FF00C0C0
label right color blue after ' :'
T wTime 'Waiting time' Numeric Width 100
Text e_mail Mail
Slider Min 'Min pressure' From 30 To 150
Slider Max 'Max pressure' From 40 To 220
Control Min -lt Max 'Minimum must be less of Maximum'
T Password '' hint 'Almost 8 characters' Password
Control Password is '^.{8,}$' 'Almost 8 characters' 
Event LostFocus on Password Call fg_wdgControl %%Password 
Control e_mail is mail 'Incorrect mail form' 
Control wTime -ge 0 'Number must be greater -1' 
Control wTime -le 1000 'waiting too long' 
Required e_mail Password wTime

Web 访问

FormGen 可以发送和接收 Web 数据。
伪类型 Get 从 Internet 请求数据来填充表单,Call 参数也可以与 Web 交互,命令语法是:

  • GET *|name URI [Every seconds]
  • … Call URI Answer FieldName [Send fieldList]

formGen 发送一个 Internet 请求,该请求取决于 AnswerSend 子参数的存在。Answer 生成一个 GET 请求来接收数据;Send 生成一个 POST 请求来传输指定的字段,包括任何文件上传。

Get 命令在显示表单之前执行;Call 命令由事件激活。

# Web *****
List Languages
C Time ' ' after Languages
List Hellas
CMB Town
File File '' filter 'Graphic files(*.jpg;*.png;*.gif)|*.jpg;*.png;*.gif|Texts(*.txt)|*.txt' title 'Graphic file'
T Answer '' Width 501
H URI https://www.condorinformatique.com/nFormgen/getITCite.php?random&CR=PS
H URI2 https://www.condorinformatique.com/nFormgen/getSample.php?Type=Time
H URI3 https://www.condorinformatique.com/nFormgen/echo.php
H fields Time,Town,Languages,Hellas,Answer,File
B getQuote Quote Call %%URI Answer Answer After Answer
B Send '' Call %%URI3 Answer fg_HTML send %%fields ToolTip 'Send form data'
Get * https://www.condorinformatique.com/nFormgen/getSample.php?Type=PSDefaults
Get Town https://www.condorinformatique.com/nFormgen/getSample.php?Type=Towns
Get Hellas https://www.condorinformatique.com/nFormgen/getSample.php?Type=Hellas
GET Time %%URI2 Every %minute
GET Languages https://www.condorinformatique.com/nFormgen/getSample.php?Type=Lang
Timer Timer every 15 delay 20 Call %%URI Answer Answer
Required File

Get 命令的响应时间取决于 Web 服务器的响应,为了最大限度地缩短响应时间,formGen 会并发发送命令。

# handle gets ***********
$GetScript = {
   Param ([string]$URI,[string]$field)
   try {
       $answer = Invoke-RestMethod -Method 'GET' -Uri $URI -SkipHttpErrorCheck
   } catch {
       $answer = $_.Exception.Message
   }
   "{$field}$answer"
}
foreach ($h in $gets.Keys) {
   $x = Start-Job $GetScript -ArgumentList $this.decodeSymbol($gets[$h]), $h
}
$aGets = Get-Job | Wait-Job | Receive-Job
Foreach ($item in $aGets) {
...

每个 Get 命令通过 Start-Job 命令调用一个后台作业($GetScript);响应通过 Receive-Job 命令累积在 $aGets 数组中,当所有作业(Get-Job)完成(Wait-Job)时。

示例

该示例基于通过 QRCode.ps1 模块生成的 QRCodes,该模块是用于为地理位置、文本、Twitter、URI 和 VCard 生成 QRCode 的 QRCodeGenerator 模块的包装器。
该脚本从 QRCodeGenerator 模块的调用语法(下面的 URI QRCode)中提取所选 QRCode 所需的字段。

PS C:\Sviluppo\PowerShell> Get-Command -Module QRCodeGenerator -name New-QRCodeURI -syntax
New-QRCodeURI (alias) -> New-PSOneQRCodeURI

New-QRCodeURI [-URI] <uri> [[-Width] <int>] [[-OutPath] <string>] [[-DarkColorRgba] <byte[]>] 
[[-LightColorRgba] <byte[]>] [-Show] [<CommonParameters>]

用户须知

在附带的文档中,除了 formGen 模块 (formgen.psm1) 之外,还有一个 sandbox.ps1 脚本,它允许通过一些示例完全探索表单生成器;只需将内容解压到一个文件夹并启动批处理脚本 powershell.bat 即可。

此外,QRCode.ps1 脚本允许您生成文本、网站和地理位置等 QRCode。

执行取决于计算机的执行策略,该策略可以通过以下命令在当前会话中绕过:Set-ExecutionPolicy Bypass -scope Process -Force;

表单生成器

语言 操作系统 来源 &
文档
试试 Code Project
B4A Android 下载   CodeProject 文章
JavaScript 浏览器 下载 演示 CodeProject 文章
Basic AutoIt Windows 下载  
B4J Basic Windows 下载  
RFO-BASIC! Android 下载    
Tcl-Tk Windows Linux 下载   CodeProject 文章
PowerShell Windows 下载  
Julia Windows Linux 下载  
Matlab/Octave Windows Linux 下载   CodeProject 文章
© . All rights reserved.