- Finns det något sätt att få den korrekta/förväntade variabeltypen att returneras när du anropar
Receive-Job
?
På grund av att du använder ett bakgrundsjobb förlorar du typtrohet :objekten du får tillbaka är emuleringar utan metod av originaltyperna.
Att manuellt återskapa originaltyperna är inte värt ansträngningen och kanske inte ens är möjligt - även om det kanske räcker med att arbeta med emuleringarna.
Uppdatera :Enligt ditt eget svar, byter du från att arbeta med System.DataSet
till System.DataTable
resulterade i användbara emuleringar för dig.
Se det nedre avsnittet för mer information.
- Finns det ett bättre sätt att köra SQL-frågor under ett annat AD-konto, med kommandot Invoke-Sqlcmd?
Du behöver en pågående anropsmetod för att bibehålla typtrohet , men jag tror inte att det är möjligt med godtyckliga kommandon om du vill imitera en annan användare .
Till exempel, det pågående (trådbaserade) alternativet till Start-Job
- Start-ThreadJob
- har inte en -Credential
parameter.
Det bästa är därför att försöka skapa Invoke-SqlCmd
s -Credential
parametern fungerar för dig eller hitta ett annat sätt under processen att köra dina frågor med en given användares autentiseringsuppgifter.
Serialisering och deserialisering av objekt i bakgrundsjobb/remoting/mini-skal:
När PowerShell flyttar objekt över processgränser , använder den XML-baserad serialisering vid källan och deserialisering vid destinationen , med ett format som kallas CLI XML (Common Language Infrastructure XML).
Detta händer i samband med PowerShell-fjärrkontroll (t.ex. Invoke-Command
samtal med -ComputerName
parameter) samt i bakgrundsjobb (Start-Job
) och så kallade miniskal (som implicit används när du anropar PowerShell CLI från PowerShell själv med ett skriptblock; t.ex. powershell.exe { Get-Item / }
).
Denna deserialisering bibehåller typtrohet endast för en begränsad uppsättning kända typer , som specificerats i MS-PSRP, PowerShell Remoting Protocol Specification. Det vill säga, endast instanser av en fast uppsättning typer deserialiseras som sin ursprungliga typ .
Förekomster av alla andra typer emuleras :listliknande typer blir [System.Collections.ArrayList]
instanser blir ordbokstyper [hasthable]
instanser och andra typer blir metodlösa (endast egenskaper) anpassade objekt ([pscustomobject]
instanser) , vars .pstypenames
egenskapen innehåller det ursprungliga typnamnet med prefixet Deserialized.
(t.ex. Deserialized.System.Data.DataTable
), såväl som de lika prefixerade namnen på typens bas typer (arvshierarki).
Dessutom är rekursionsdjupet för objektgrafer av icke -[pscustomobject]
instanser är begränsade till 1
nivå - Observera att detta inkluderar instanser av PowerShell anpassade klasser , skapad med class
nyckelord:Det vill säga, om ett indataobjekts egenskapsvärden inte är instanser av välkända typer i sig (den senare inkluderar enbart typer av ett värde, inklusive primitiva .NET-typer som [int]
, till skillnad från typer som består av flera egenskaper), ersätts de av deras .ToString()
representationer (t.ex. skriv System.IO.DirectoryInfo
har en .Parent
egenskap som är en annan System.IO.DirectoryInfo
instans, vilket betyder att .Parent
egenskapsvärdet serialiseras som .ToString()
representation av den instansen, som är dess fullständiga sökvägssträng); kort sagt:Icke-anpassade (skalära) objekt serialiseras så att egenskapsvärden som inte själva är instanser av välkända typer ersätts med deras .ToString()
representation ; se det här svaret för ett konkret exempel.
Däremot explicit användning av CLI XML-serialisering via Export-Clixml
förinställer ett djup på 2
(du kan ange ett anpassat djup via -Depth
och du kan på samma sätt styra djupet om du använder den underliggande System.Management.Automation.PSSerializer
skriv direkt ).
Beroende på originaltypen kan du kunna rekonstruera instanser av den ursprungliga typen manuellt , men det är inte garanterat.(Du kan få originaltypens fullständiga namn genom att anropa .pstypenames[0] -replace '^Deserialized\.'
på ett givet anpassat objekt.)
Beroende på dina bearbetningsbehov, dock emuleringarna av de ursprungliga objekten kan vara tillräckliga.