Я промочился от классов 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, которую мне нужно обойти, также может быть причиной.