Первый случай плохого поведения в классе Powershell - PullRequest
0 голосов
/ 15 марта 2020

Я промочился от классов PS, пытаясь реализовать класс идентификатора типа пути. По сути, я хочу передать строку и определить различия в файловой системе и путях реестра. В основном это работает, но, как ни странно, первый элемент, который я тестирую, независимо от того, что это, свойства пустые, когда я смотрю, хотя никакой ошибки не появляется. И кажется, что результаты на самом деле из предыдущего экземпляра, по крайней мере, для «успешных» экземпляров. Брошенные исключения, кажется, работают как ожидалось. Итак, когда $test = @('C:\folder', 'D:\', 'C:', 'K:', '\\Server\Folder\*', '\ junk', '?:'), Мои результаты будут

C:\folder



D:\
 FileSystem_Folder
 LocalDisk folder

C:
 FileSystem_Drive
 OpticalDisk drive

K:
 FileSystem_Drive
 LocalDisk drive

\\Server\Folder\*
 FileSystem_Drive
 Unknown drive

! \junk
 Not Identified: \junk

! ?:
 Not Identified: ?:

Это код, о котором идет речь.

class PxPath {
    # Properties
    hidden [array]$validPathTypes = @('FileSystem_Drive', 'FileSystem_Folder', 'FileSystem_File', 'Registry_Key', 'Registry_Property')
    hidden [hashtable]$regExLookup = @{
        registryHive = '^(?<hive>HKCC|HKEY_CURRENT_CONFIG|HKCR|HKEY_CLASSES_ROOT|HKCU|HKEY_CURRENT_USER|HKLM|HKEY_LOCAL_MACHINE)(?<seperator>:)?$'
        registryPath = '^(?<hive>HKCC|HKEY_CURRENT_CONFIG|HKCR|HKEY_CLASSES_ROOT|HKCU|HKEY_CURRENT_USER|HKLM|HKEY_LOCAL_MACHINE)(?<seperator>:)?\\(?<remainder>.+)$'
        fileSystemDriveOnly= '^(?<drive>[a-zA-Z]:)(\\)?$'
        fileSystemDrivePath = '^(?<drive>[a-zA-Z]:)\\(?<remainder>.+)$'
        fileSystemUNCPath = '^(?<server>\\\\[^<>:"/\\\|]*)\\(?<remainder>.+)$'
    }
    hidden [hashtable]$driveTypeLookup = @{
        0 = 'Unknown'
        1 = 'NoRootDirectory'
        2 = 'RemovableDisk'
        3 = 'LocalDisk'
        4 = 'NetworkDrive'
        5 = 'OpticalDisk'
        6 = 'RamDisk'
    }
    [string]$Description = $null
    [string]$Type = $null

    # Constructors
    PxPath ([string]$path) {
        $this.PathType($path)
    }
    PxPath ([string]$path, [string]$pathType) {
        if ($this.validPathTypes -contains $pathType) {
             $this.PathType($path)
             if ($this.Type -ne $pathType) {
                Throw "$($this.Type) does not match: $pathType"
             }
        } else {
            Throw "Not a valid path type: $pathType"
        }
    }

    hidden [void] PathType ([string]$path) {
        [string]$driveType = $null
        [string]$extension = $null
        [string]$extension = $null

        switch -regex ($path) {
            $this.regExLookup.fileSystemDriveOnly {
                $driveType = $this.driveTypeLookup.Get_Item([int](Get-WmiObject Win32_LogicalDisk -computerName:. -filter:"name='$($matches.drive)'" | Select DriveType).DriveType)
                $this.Description = "$driveType drive"
                $this.Type = 'FileSystem_Drive'
            }
            $this.regExLookup.fileSystemDrivePath {
                $driveType = $this.driveTypeLookup.Get_Item([int](Get-WmiObject Win32_LogicalDisk -computerName:. -filter:"name='$($matches.drive)'" | Select DriveType).DriveType)
                if ($extension = [System.IO.Path]::GetExtension($path)) {
                    $this.Description = "$driveType file"
                    $this.Type = 'FileSystem_File'
                } else {
                    $this.Description = "$driveType folder"
                    $this.Type = 'FileSystem_Folder'
                }
            }
            $this.regExLookup.fileSystemUNCPath {
                if ($extension = [System.IO.Path]::GetExtension($path)) {
                    $this.Description = "UNC file"
                    $this.Type = 'FileSystem_File'
                } else {
                    $this.Description = "UNC folder"
                    $this.Type = 'FileSystem_Folder'
                }
            }
            $this.regExLookup.registryPath {
            }
            default {
                Throw "Not Identified: $path"
            }
        }
    }
}

CLS
$test = @('C:\folder', 'D:\', 'C:', 'K:', '\\Server\Folder\*', '\junk', '?:')

foreach ($testitem in $test) {
    $path = try {
        [PxPath]::New($testitem)
        Write-Host $testitem
        Write-Host " $($path.Type)"
        Write-Host " $($path.Description)"
        Write-Host
    } catch {
        Write-Host "! $testitem"
        Write-Host " $($_.Exception.Message)"
        Write-Host
    }
}

Я подозреваю, что проблема - это то, чего я просто не понимаю с классами, но я предполагаю, что ошибка в PowerShell, которую мне нужно обойти, также может быть причиной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...