You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell GUI密码生成器报错:ToInt32无0参数匹配重载

PowerShell GUI密码生成器错误排查与修复

问题现象

合并GUI界面与密码生成函数后出现以下错误:

找不到匹配0个参数的"ToInt32"重载方法。
在 C:\Users\sh\Desktop\Test Powershell PWG_01.ps1:130 字符:5    
+     $a = -join ($UpperCaseLetters +
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest

该错误出现在修复“无法将对象转换为int”错误之后,当时的修复代码为:

$ActionButton.Add_Click({Get-RandomPassword (([int]$length = $Zeichen.SelectedIndex), $chkB1, $chkB2, $chkB3 )})

错误根源

  1. 参数传递错误:

    • 调用Get-RandomPassword时,([int]$length = $Zeichen.SelectedIndex)是赋值语句,且括号包裹加逗号的写法会将第一个参数转为数组,导致函数内$length是数组而非整数,调用$length.ToInt32()自然报错。
    • 传递的是复选框控件对象而非其Checked布尔属性,函数内判断逻辑失效。
    • 使用$Zeichen.SelectedIndex(索引值)而非下拉框选中的实际长度值(如索引0对应8),导致密码长度不符合预期。
  2. 函数内部问题:

    • 未定义$LowerCaseLetters变量,字符集拼接时会引用空值。
    • 字符集逻辑错误:复选框未勾选时将对应字符集替换为小写字母,而非不添加该类字符。

修复方案

1. 修正按钮点击事件参数传递

将按钮点击事件代码修改为:

$ActionButton.Add_Click({
    # 获取下拉框选中的实际长度值
    $selectedLength = [int]$Zeichen.Items[$Zeichen.SelectedIndex]
    # 传递复选框的Checked属性(布尔值)给函数
    $result = Get-RandomPassword -length $selectedLength -includeUpperLower $chkB1.Checked -includeNumbers $chkB2.Checked -includeSpecial $chkB3.Checked
    # 将生成的密码显示到输出框
    $txtHost.Text = $result
})

2. 重构密码生成函数

修正字符集逻辑,补全未定义变量:

function Get-RandomPassword ($length, $includeUpperLower, $includeNumbers, $includeSpecial){
    $charSet = @()

    # 添加大小写字母(复选框勾选时)
    if ($includeUpperLower) {
        $charSet += (65..90) + (97..122)
    } else {
        # 未勾选时默认添加小写字母
        $charSet += (97..122)
    }

    # 添加数字(复选框勾选时)
    if ($includeNumbers) {
        $charSet += (48..57)
    }

    # 添加特殊字符(复选框勾选时)
    if ($includeSpecial) {
        # 扩展特殊字符范围,可根据需求调整
        $charSet += (33..47) + (58..64) + (91..96) + (123..126)
    }

    # 确保字符集不为空
    if (-not $charSet) {
        $charSet = (97..122)
    }

    $password = -join ($charSet | Get-Random -Count $length | ForEach-Object {[char]$_})
    $password | Clip
    return $password
}

3. 修正输出框初始值

将输出框初始化代码中的$txtHost.Text = $a改为:

$txtHost.Text = ""

完整修复后代码

Add-Type -AssemblyName System.Windows.Forms
Add-Type -a System.Drawing   #加载GUI所需的.NET扩展   # -a 是 -AssemblyName 的缩写

$objForm = New-Object System.Windows.Forms.Form # 创建窗口
$objForm.Text = "Password Manager Ultimate"
# $objForm.Icon="C:\Users\sh\Desktop\PWMicon.ico" # 移除或替换为本地图标路径
$objForm.Backcolor="white"
$objForm.Size = New-Object System.Drawing.Size(600,700)
$objForm.BackgroundImageLayout = 2
# $objForm.BackgroundImage =[System.Drawing.Image]::FromFile('C:\Users\sh\Desktop\schloss.jpg') # 移除或替换为本地背景图路径

$objLabel = New-Object System.Windows.Forms.Label # 来自Forms程序集的Label对象类
$objLabel.Location = New-Object System.Drawing.Size(200,480)
$objLabel.Size = New-Object System.Drawing.Size(150,20)
$objLabel.Text = "添加邮箱地址"
$objForm.Controls.Add($objLabel)

$objTextBox = New-Object System.Windows.Forms.TextBox # 输入框
$objTextBox.Location = New-Object System.Drawing.Size(200,500)
$objTextBox.Size = New-Object System.Drawing.Size(200,20)
$objForm.Controls.Add($objTextBox)

$Description                     = New-Object system.Windows.Forms.Label             # 字符长度说明
$Description.text                = "字符长度"
$Description.AutoSize            = $false
$Description.width               = 75
$Description.height              = 20
$Description.location            = New-Object System.Drawing.Point(20,120)
$objForm.Controls.Add($Description)

$Zeichen                     = New-Object system.Windows.Forms.ComboBox 
$Zeichen.text                = ""
$Zeichen.autosize            = $true
# 添加下拉列表项
@(8..32) | ForEach-Object {[void] $Zeichen.Items.Add($_)}
# 设置默认选中项
$Zeichen.SelectedIndex       = 0
$Zeichen.location            = New-Object System.Drawing.Point(20,150)
$Zeichen.Font                = 'Microsoft Sans Serif,10'
$Zeichen.Width = 45
$objForm.Controls.Add($Zeichen)

$txtHost = New-Object Windows.Forms.TextBox  # 生成密码的输出框
$txtHost.TabIndex = 0 # Tab键顺序
$txtHost.Top = 150; $txtHost.Left = 200; $txtHost.Width = 200;
$txtHost.height              = 20
$txtHost.Text = "" # 修正初始值
$objForm.Controls.Add($txtHost)

$ActionButton = New-Object System.Windows.Forms.Button # 生成按钮
$ActionButton.Location = New-Object System.Drawing.Size(262,120)
$ActionButton.Size = New-Object System.Drawing.Size(76,23)
$ActionButton.Text = "生成"
$ActionButton.Name = "生成"
$ActionButton.DialogResult = "Cancel"
# 修正点击事件参数传递
$ActionButton.Add_Click({
    $selectedLength = [int]$Zeichen.Items[$Zeichen.SelectedIndex]
    $result = Get-RandomPassword -length $selectedLength -includeUpperLower $chkB1.Checked -includeNumbers $chkB2.Checked -includeSpecial $chkB3.Checked
    $txtHost.Text = $result
})
$objForm.Controls.Add($ActionButton)

$SaveButton = New-Object System.Windows.Forms.Button # 保存按钮
$SaveButton.Location = New-Object System.Drawing.Size(450,500)
$SaveButton.Size = New-Object System.Drawing.Size(75,23)
$SaveButton.Text = "保存"
$SaveButton.Name = "保存"
$SaveButton.DialogResult = "Cancel"
$SaveButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($SaveButton)

$chkB1 = New-Object Windows.Forms.checkbox
$chkB1.Left = 20; $chkB1.Width = 200; $chkB1.Top = 10
$chkB1.Text = "大小写字母"
$chkB1.Checked = $true
$chkB1.TabIndex = 2
$objForm.Controls.Add($chkB1)

$chkB2 = New-Object Windows.Forms.checkbox
$chkB2.Left = 20; $chkB2.Width = 200; $chkB2.Top = 35
$chkB2.Text = "包含数字"
$chkB2.Checked = $true
$chkB2.TabIndex = 2
$objForm.Controls.Add($chkB2)

$chkB3 = New-Object Windows.Forms.checkbox
$chkB3.Left = 20; $chkB3.Width = 200; $chkB3.Top = 60
$chkB3.Text = "包含特殊字符" # 修正复选框文本,原文本表述重复
$chkB3.Checked = $false
$chkB3.TabIndex = 2
$objForm.Controls.Add($chkB3)

$CancelButton = New-Object System.Windows.Forms.Button # 关闭按钮
$CancelButton.Location = New-Object System.Drawing.Size(450,600)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Backcolor="yellow"
$CancelButton.Text = "退出"
$CancelButton.Name = "退出"
$CancelButton.DialogResult = "Cancel"
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

# 重构后的密码生成函数
function Get-RandomPassword ($length, $includeUpperLower, $includeNumbers, $includeSpecial){
    $charSet = @()

    if ($includeUpperLower) {
        $charSet += (65..90) + (97..122)
    } else {
        $charSet += (97..122)
    }

    if ($includeNumbers) {
        $charSet += (48..57)
    }

    if ($includeSpecial) {
        $charSet += (33..47) + (58..64) + (91..96) + (123..126)
    }

    if (-not $charSet) {
        $charSet = (97..122)
    }

    $password = -join ($charSet | Get-Random -Count $length | ForEach-Object {[char]$_})
    $password | Clip
    return $password
}

# 用户账户验证函数
function Test-Cred {
           
    [CmdletBinding()]
    [OutputType([String])] 
       
    Param ( 
        [Parameter( 
            Mandatory = $false, 
            ValueFromPipeLine = $true, 
            ValueFromPipelineByPropertyName = $true
        )] 
        [Alias( 
            'PSCredential'
        )] 
        [ValidateNotNull()] 
        [System.Management.Automation.PSCredential]
        [System.Management.Automation.Credential()] 
        $Credentials
    )
    $Domain = $null
    $Root = $null
    $Username = $null
    $Password = $null
      
    If($Credentials -eq $null)
    {
        Try
        {
            $Credentials = Get-Credential "domain\$env:username" -ErrorAction Stop
        }
        Catch
        {
            $ErrorMsg = $_.Exception.Message
            Write-Warning "验证凭据失败:$ErrorMsg "
            Pause
            Break
        }
    }
      
    Try
    {
        $Username = $credentials.username
        $Password = $credentials.GetNetworkCredential().password
  
        $Root = "LDAP://" + ([ADSI]'').distinguishedName
        $Domain = New-Object System.DirectoryServices.DirectoryEntry($Root,$UserName,$Password)
    }
    Catch
    {
        $_.Exception.Message
        Continue
    }
  
    If(!$domain)
    {
        Write-Warning "哎呀..出问题了。"
    }
    Else
    {
        If ($null -ne $domain.name)
        {
            return "Authenticated"
        }
        Else
        {
            return "Not authenticated"
        }
    }
}

$CredCheck = 0
$Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials

$CredCheck = $Credentials  | Test-Cred togrund\$env:USERNAME
Clear-Host
If($CredCheck -eq "Authenticated")
{
    [void] $objForm.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true }))
}
else
{
    Write-Warning "登录失败"
    Break
}

内容的提问来源于stack exchange,提问作者Reptiloid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:00:58