代码似乎需要Powershell 4,但是,看不出原因

时间:2016-04-01 21:01:41

标签: powershell powershell-v3.0

所以我使用表单构建了一个powershell工具....它可以工作......下面的代码没有任何问题,除了它在Powershell 3中不起作用。它必须是4 ..我可以找不到任何特定于4.0的内容。

我查看了我正在使用的cmdlet的所有technet页面,它们都具有针对3和4列出的相同功能。

有什么想法吗?

基本功能就是这个......

  1. 清除4个文本框。

  2. 它查看了一个复选框列表,只提供了一个项目 读入该文件中的数据并查找以#。

  3. 开头的单词
  4. 如果它找到长度大于4的匹配...我假设找到一个变量,因为我们所有的变量都将超过4个字母。我这样做是因为如果只找到一个,.count将不起作用。但如果发生了4次匹配,则.length将为4 ..就像单个项目的长度为4一样。 如果长度为4或更小,我将处理为4个或更少的个体变量。
  5. 我现在将它们传递到表单
  6. 上的text和accessiblename字段

    然后在任何一种情况下..我更新状态栏。

    没什么特别的。

    $btn_LoadOptions = New-Object System.Windows.Forms.Button
    $btn_LoadOptions.Font = New-Object System.Drawing.Font("Consolas", 8.25)
    $btn_LoadOptions.Location = New-Object System.Drawing.Point(156, 184)
    $btn_LoadOptions.Size = New-Object System.Drawing.Size(168, 23)
    $btn_LoadOptions.TabIndex = 11
    $btn_LoadOptions.Text = "Load Options"
    $btn_LoadOptions.UseVisualStyleBackColor = $true
    $btn_LoadOptions.add_Click({btn_LoadOptions_Click($btn_LoadOptions)})
    
    function btn_LoadOptions_Click($object)
    {
        clean-messageboxes
        if ($cbl_DefaultMessageChoices.CheckedItems.Count -eq 1)
        {
            $regex = [regex]'(#\w+)'
        $found = Select-String -Pattern $regex -path $messagechoice -AllMatches | % { $_.Matches } | % { $_.Value }
        if ($found.Length -gt 4)
        {
            $tb_MessageOption1.Text = $found
            $tb_MessageOption1.AccessibleName = $found
        }
        else
        {
            $tb_MessageOption1.Text = $found[0]
            $tb_MessageOption1.AccessibleName = $found[0]
            $tb_MessageOption2.Text = $found[1]
            $tb_MessageOption2.AccessibleName = $found[1]
            $tb_MessageOption3.Text = $found[2]
            $tb_MessageOption3.AccessibleName = $found[2]
            $tb_MessageOption4.Text = $found[3]
            $tb_MessageOption4.AccessibleName = $found[3]
        }
        $sb_TOC_PowerTools.Text = "Message Options Loaded"
    }
    else
    {
        $sb_TOC_PowerTools.Text = "No message choosen"
    }
    }
    
    function clean-messageboxes 
    {
    $tb_MessageOption1.Text = ""
    $tb_MessageOption2.Text = ""
    $tb_MessageOption3.Text = ""
    $tb_MessageOption4.Text = ""
    }
    

1 个答案:

答案 0 :(得分:4)

您在评论中提到您分配$messagechoice变量,如下所示:

$global:messagechoice = $pgmessagedefaults_path + "\" + ($cbl_DefaultMessageChoices.CheckedItems.ForEach({$f = ($_ + ".txt");return $f}))

.ForEach({})扩展方法为a PowerShell 4.0 feature,这解释了为什么它在PowerShell 3.0中不起作用

改为使用ForEach-Object cmdlet:

$global:messagechoice = $pgmessagedefaults_path + "\" + ($cbl_DefaultMessageChoices.CheckedItems |ForEach-Object {$_ + ".txt"})