странная ошибка с powershell и C# (visualStudio) Cmdlet - PullRequest
0 голосов
/ 12 июля 2020

Я разрабатываю Powershell CmdLet в C # для стандартизации установок через SCCM в нашей компании. со вчерашнего дня (возможно, Windows Updates ??) я получаю сообщение об ошибке при вызове моего командлета в Powershell ise. раньше это работало таким образом несколько недель (??).

Update-Environment : the handle is invalid.
In C:\...\Install.ps1:56 Zeichen:5
+     Update-Environment
+     ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Update-Environment], IOException
    + FullyQualifiedErrorId : System.IO.IOException,InstallTools.CmdLets.UpdateEnvironment.UpdateEnvironment

Update-Environment является первым вызовом и устанавливает некоторые переменные среды, такие как Source, DateTime, параметры ведения журнала через NLog, ...

для тестирования моего решения я установил параметры DebugParameters в VisualStudio (2019 Professional):

  • Внешняя программа: C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe
  • CommandlineArguments: -noexit -file "c: \ полный путь к \ Install.ps1" -Silent -Priority veryHIGH

Install.ps1 - это шаблон для упаковщиков (фрагментировано ):

[CmdletBinding()]
Param 
(
    [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)][switch]$Uninstall,
    [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)][Int]$Restart,
    [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)][string]$Priority = 'NORMAL',
    [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)][switch]$Silent
)

PROCESS {
    if(-not $PSScriptRoot) {
        $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
    }

    #region ---------------------- SET LOCAL VARIABLES HERE -------------------------------
    [switch]$env:Silent                     = $Silent
    [string]$env:Priority                   = $Priority 
    [string] $env:AppsToClose               = "Firefox, Chrome, \Microsoft Office "

    [string]$env:SourceFolder               = "$PSScriptRoot\Source"
    [string]$env:DisplayName                = 'SAP GUI 1.3.4.675 with IXOS 10.5 and Business Explorer'
    [string]$env:PackageAutor               = 'Name'
    #endregion

    #region -------------- IMPORTING MODULES and Set Start Values ----------------------------
    try {
        Import-Module "C:\Users\TestUser\Desktop\InstallTools\__Projects\InstallTools\bin\Debug\InstallTools.dll" -Global -Force
    } catch{return 1}

    Update-Environment

CmdLet (вырезано):

namespace InstallTools.CmdLets.UpdateEnvironment
{
    using System;
    using System.Linq;
    using System.Management.Automation;
    using System.Text.RegularExpressions;

    [Cmdlet(VerbsData.Update, "Environment")]
    [OutputType(typeof(UpdateEnvironment))]
    public partial class UpdateEnvironment : PSCmdlet
    {
        [Parameter(Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
        public SwitchParameter SetLapTime { get; set; }

        [Parameter(Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
        public SwitchParameter GetLapTime { get; }

        [Parameter(Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
        public SwitchParameter GetBegin { get; }

        [Parameter(Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
        public SwitchParameter GetBeginForFile { get; set; }

        [Parameter(Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
        public SwitchParameter CalcLapDuration { get; set; }

        [Parameter(Mandatory = false, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
        public SwitchParameter CalcTotalDuration { get; set; }
        #endregion


        protected override void ProcessRecord()
        {
            base.ProcessRecord();
        }
    }
}

Когда я запускаю через VisualStudio, все работает нормально. Но при запуске через PS1 я получаю ошибку.

Кто-нибудь знает, почему здесь что-то не так?

Спасибо за поддержку!

Крис

1 Ответ

0 голосов
/ 08 августа 2020

Наконец-то я нашел уловку!

у нашей компании есть несколько компьютеров со старой версией Powershell. в моем проекте Visual Studio я использую расширение nuget для Powershell (Microsoft.PowerShell.5.1.ReferenceAssemblies). это не поддерживается в PowerShell 5.0.

привет!

...