- Има ли начин да се върне правилният/очакван тип променлива при извикване на
Receive-Job
?
Поради използването на фоново задание губите точност на типа :обектите, които връщате, са емулации без метод от оригиналните типове.
Ръчното пресъздаване на оригиналните типове не си струва усилията и дори може да не е възможно - макар че може би работата с емулациите е достатъчна.
Актуализиране :Според вашия собствен отговор, превключване от работа с System.DataSet
към System.DataTable
доведе до полезни емулации за вас.
Вижте долния раздел за повече информация.
- Има ли по-добър начин за изпълнение на SQL заявки под различен AD акаунт, като се използва командата Invoke-Sqlcmd?
Имате нужда от в процес метод на извикване с цел поддържане на вярност на типата , но не мисля, че това е възможно с произволни команди, ако искате да имитирате друг потребител .
Например алтернативата в процеса (базирана на нишки) на Start-Job
- Start-ThreadJob
- няма -Credential
параметър.
Следователно най-добрият ви залог е да опитате да направите Invoke-SqlCmd
-Credential
параметърът работи за вас или намерете различен по време на процеса начин за изпълнение на вашите заявки с идентификационни данни на даден потребител.
Сериализиране и десериализация на обекти във фонови задания / отдалечени / мини-обвивки:
Всеки път, когато PowerShell маршалира обекти през границите на процеса , той използва базирана на XML сериализация при източника и десериализация на дестинациятата , използвайки формат, известен като CLI XML (XML на общата езикова инфраструктура).
Това се случва в контекста на отдалечаването на PowerShell (напр. Invoke-Command
извиквания с-ComputerName
параметър), както и във фонови задания (Start-Job
) и така нареченитемини-черупки (които се използват имплицитно, когато извиквате PowerShell CLI от вътре в самия PowerShell със скриптов блок; например powershell.exe { Get-Item / }
).
Тази десериализация поддържа точност на типа само за ограничен набор от известни типове , както е посочено в MS-PSRP, спецификацията на PowerShell Remoting Protocol Protocol. Тоест само екземпляри от фиксиран набор от типове се десериализират като оригиналния им тип .
Екземпляри от всички други типове емулират :списъчни типове стават [System.Collections.ArrayList]
екземпляри, типовете речници стават [hasthable]
екземпляри и други типове стани без метод (само за свойства) персонализирани обекти ([pscustomobject]
случаи) , чиито .pstypenames
свойството съдържа оригиналното име на тип с префикс Deserialized.
(напр. Deserialized.System.Data.DataTable
), както и имената с еднакъв префикс на база на типа типове (йерархия на наследяване).
Освен това, дълбочината на рекурсията за обектни графики на не -[pscustomobject]
екземпляри е ограничен до 1
ниво - имайте предвид, че това включва екземпляр на PowerShell персонализирани класове , създаден с class
ключова дума:Тоест, ако стойностите на свойството на входния обект не са екземпляр на добре познати типове (последният включва типове само с една стойност, включително примитивни типове .NET, като [int]
, за разлика от типовете, съставени от множество свойства), те се заменят със своя .ToString()
представяния (например, тип System.IO.DirectoryInfo
има .Parent
свойство, което е друг System.IO.DirectoryInfo
екземпляр, което означава, че .Parent
стойността на свойството се сериализира като .ToString()
представяне на този екземпляр, което е неговият пълен низ от пътя); накратко:Неперсонализираните (скаларни) обекти се сериализират така, че стойностите на свойства, които сами по себе си не са екземпляри на добре познати типове, се заменят от техния .ToString()
представителство ; вижте този отговор за конкретен пример.
За разлика от това, изрично използване на CLI XML сериализация чрез Export-Clixml
по подразбиране на дълбочина от 2
(можете да посочите персонализирана дълбочина чрез -Depth
и можете по подобен начин да контролирате дълбочината, ако използвате основния System.Management.Automation.PSSerializer
въведете директно ).
В зависимост от оригиналния тип, можете да можете да реконструирате екземпляри от оригиналния тип ръчно , но това не е гарантирано. (Можете да получите пълното име на оригиналния тип, като извикате .pstypenames[0] -replace '^Deserialized\.'
върху даден персонализиран обект.)
В зависимост от вашите нужди от обработка обаче, емулациите от оригиналните обекти може да е достатъчно.