[Class] :: New () вызывает пустую строку на консоли - PullRequest
1 голос
/ 30 марта 2020

Я работаю над реализацией одноэлементного класса для хранения некоторой регулярно доступной информации о состоянии для моего скрипта, включая решение проблемы, связанной с тем, что $myInvocation заполняется только в основном скрипте. Все работает как запланировано с этим.

class pxStatus {
    static [pxStatus] $singleton = $null
    [string]$Context = 'machine'
    [string]$Path = $null
    [datetime]$StartTime = (Get-Date)

    pxStatus ([string]$path) {
        if ([pxStatus]::singleton -eq $null) {
            $this.Path = $path
            [pxStatus]::singleton = $this
        } else {
            Throw "Singleton already initialized"
        }
    }

    static [pxStatus] Get() {
        if ([pxStatus]::singleton -eq $null) {
            Throw "Singleton not yet initialized"
        } else {
            return [pxStatus]::singleton
        }
    }
}

CLS
[void]([pxStatus]::New((Split-Path ($myInvocation.myCommand.path) -parent)))
([pxStatus]::Get()).StartTime
([pxStatus]::Get()).Context
([pxStatus]::Get()).Path

За одним исключением. Даже с этим [void] в строке [pxStatus]::New() я получаю пустую строку в консоли. Даже $null = ([pxStatus]::New((Split-Path ($myInvocation.myCommand.path) -parent))) выводит на консоль пустую строку. И для моей жизни я не могу понять, что вызывает это.

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Это не new, которая вызывает пустую строку, а ([pxStatus]::Get()).StartTime.

. Чтобы устранить проблему, вы можете вывести ее в виде строки, т.е. не отформатировать, например, ([pxStatus]::Get()).StartTime.ToString()

1 голос
/ 30 марта 2020

Ваша проблема уже была диагностирована , но я хотел бы на секунду показать, как на самом деле реализовать синглтонный тип в PowerShell (см. встроенные комментарии):

class pxStatus {

    # hide backing field from user
    hidden static [pxStatus] $singleton = $null

    [string]$Context = 'machine'
    [string]$Path = $null
    [datetime]$StartTime = (Get-Date)

    # hide instance constructor, no one should call this directly
    hidden pxStatus ([string]$path) {
        # Only allow to run if singleton instance doesn't exist already
        if ($null -eq [pxStatus]::singleton) {
            $this.Path = $path
        } else {
            Throw "Singleton already initialized - use [pxStatus]::Get()"
        }
    }

    # Use a static constructor to initialize singleton
    # guaranteed to only run once, before [pxStatus]::Get() or [pxStatus]::singleton
    static pxStatus () {
        # grab the path from context, don't rely on user input
        if(-not $PSScriptRoot){
            throw "[pxStatus] can only be used in scripts!"
        }
        # this will only succeed once anyway
        [pxStatus]::singleton = [pxStatus]::new($PSScriptRoot)
    }

    static [pxStatus] Get() {
        # No need to (double-)check ::singleton, static ctor will have run already
        return [pxStatus]::singleton
    }
}

[pxStatus]::Get().StartTime
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...