- Có cách nào để trả về loại biến đúng / dự kiến khi gọi
Receive-Job
không ?
Do sử dụng công việc nền, bạn mất độ trung thực của loại :các đối tượng bạn đang lấy lại là mô phỏng không có phương pháp của các loại ban đầu.
Việc tạo lại các kiểu gốc theo cách thủ công là không đáng để nỗ lực và thậm chí có thể không thực hiện được - mặc dù có lẽ chỉ cần làm việc với các mô phỏng là đủ.
Cập nhật :Theo câu trả lời của riêng bạn, chuyển từ làm việc với System.DataSet
tới System.DataTable
dẫn đến các mô phỏng có thể sử dụng được cho bạn.
Xem phần dưới cùng để biết thêm thông tin.
- Có cách nào tốt hơn để chạy các truy vấn SQL trong một tài khoản AD khác bằng cách sử dụng lệnh Invoke-Sqlcmd không?
Bạn cần một trong quá trình phương pháp gọi để duy trì độ trung thực của kiểu , nhưng tôi không nghĩ rằng điều đó có thể xảy ra với các lệnh tùy ý nếu bạn muốn mạo danh người dùng khác .
Ví dụ:trong quá trình (dựa trên chuỗi) thay thế cho Start-Job
- Start-ThreadJob
- không có -Credential
tham số.
Vì vậy, đặt cược tốt nhất của bạn là cố gắng tạo Invoke-SqlCmd
của -Credential
tham số hoạt động cho bạn hoặc tìm một cách khác trong quá trình chạy các truy vấn của bạn với thông tin đăng nhập của một người dùng nhất định.
Serialization và deserialization các đối tượng trong background job / remoting / mini-shell:
Bất cứ khi nào PowerShell thống nhất các đối tượng qua ranh giới quy trình , nó sử dụng tuần tự hóa dựa trên XML tại nguồn và deserialization tại điểm đến , sử dụng định dạng được gọi là CLI XML (Cơ sở hạ tầng ngôn ngữ chung XML).
Điều này xảy ra trong ngữ cảnh PowerShell Remoting (ví dụ:Invoke-Command
gọi bằng
-ComputerName
tham số) cũng như trong công việc nền (Start-Job
) và cái gọi là vỏ nhỏ (được sử dụng ngầm khi bạn gọi PowerShell CLI từ bên trong PowerShell chính nó với một khối tập lệnh ; ví dụ:powershell.exe { Get-Item / }
).
Quá trình deserialization này duy trì độ trung thực của loại chỉ dành cho một tập hợp giới hạn các loại đã biết , như được chỉ định trong MS-PSRP, Đặc điểm kỹ thuật giao thức điều khiển từ xa PowerShell. Có nghĩa là, chỉ các trường hợp của một nhóm loại cố định mới được deserialized như loại ban đầu của chúng .
Bản sao của tất cả các loại khác đều được mô phỏng :các kiểu giống danh sách trở thành [System.Collections.ArrayList]
các trường hợp, loại từ điển trở thành [hasthable]
phiên bản và các loại khác trở thành đối tượng tùy chỉnh không có phương thức (chỉ thuộc tính) ([pscustomobject]
phiên bản) , có .pstypenames
thuộc tính chứa tên loại ban đầu có tiền tố là Deserialized.
(ví dụ:Deserialized.System.Data.DataTable
), cũng như các tên có tiền tố bằng nhau của loại cơ sở các loại (hệ thống phân cấp kế thừa).
Ngoài ra, độ sâu đệ quy cho đồ thị đối tượng của non - [pscustomobject]
các phiên bản được giới hạn ở 1
cấp độ - lưu ý rằng điều này bao gồm phiên bản của các lớp tùy chỉnh PowerShell , được tạo bằng lớp class
keyword:Nghĩa là, nếu các giá trị thuộc tính của đối tượng đầu vào không phải là trường hợp của chính các kiểu nổi tiếng (sau này bao gồm các kiểu chỉ có giá trị đơn lẻ, bao gồm các kiểu nguyên thủy .NET chẳng hạn như [int]
, trái ngược với các kiểu bao gồm nhiều thuộc tính), chúng được thay thế bằng .ToString()
của chúng đại diện (ví dụ:nhập System.IO.DirectoryInfo
có .Parent
thuộc tính khác System.IO.DirectoryInfo
ví dụ, có nghĩa là .Parent
giá trị thuộc tính tuần tự hóa dưới dạng .ToString()
đại diện của cá thể đó, là chuỗi đường dẫn đầy đủ của nó); nói ngắn gọn: Các đối tượng không tùy chỉnh (vô hướng) tuần tự hóa sao cho các giá trị thuộc tính không phải là phiên bản của các loại nổi tiếng được thay thế bằng .ToString()
của chúng đại diện ; xem câu trả lời này để biết một ví dụ cụ thể.
Ngược lại, rõ ràng sử dụng tuần tự hóa CLI XML qua Export-Clixml
mặc định ở độ sâu 2
(bạn có thể chỉ định độ sâu tùy chỉnh qua -Depth
và bạn có thể kiểm soát độ sâu tương tự nếu bạn sử dụng System.Management.Automation.PSSerializer
bên dưới gõ trực tiếp ).
Tùy thuộc vào loại ban đầu, bạn có thể có thể tạo lại các bản sao của loại ban đầu theo cách thủ công , nhưng điều đó không được đảm bảo. (Bạn có thể lấy tên đầy đủ của loại ban đầu bằng cách gọi .pstypenames[0] -replace '^Deserialized\.'
trên một đối tượng tùy chỉnh nhất định.)
Tuy nhiên, tùy thuộc vào nhu cầu xử lý của bạn, các mô phỏng của các đối tượng ban đầu có thể là đủ.