Powershell trả về đầu ra sai
Tôi đã đơn giản hóa quy trình để bất kỳ ai cũng có thể tái tạo nó (trong tập lệnh của tôi, đó là một vấn đề trong quy trình làm việc, không có chức năng nào liên quan, do đó tôi không thể lưu các giá trị này trong các biến và sau đó hiển thị chúng bằng bảng điều khiển). Điều đầu tiên là sử dụng PowerShell ISE.
hàm AAA {
$datum1 = New-Object -TypeName PSObject
$datum1 | Add-Member -MemberType NoteProperty -Tên cộtA -Giá trị "AA"
$datum1 | Add-Member -MemberType NoteProperty -Name ColumnB -Value "BB"
return $datum1
}
hàm BBB {
$datum2 = New-Object -TypeName PSObject
$datum2 | Add-Member -MemberType NoteProperty -Tên cộtA -Giá trị "AA"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnC -Value "CC"
$datum2 | Add-Member -MemberType NoteProperty -Tên cộtD -Giá trị "DD"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnE -Value "EE"
$datum2 | Add-Member -MemberType NoteProperty -Tên cộtF -Value "FF"
trả về $ datum2
}
AAA
BBB
Đầu ra:
Cột A CộtB
------- -------
AA BB
AA
Bất kỳ ý tưởng tại sao điều này xảy ra?
CHỈNH SỬA: Tôi đã giải quyết "sh1t" này theo cách sau
hàm AAA {
$ datum1 = Đối tượng mới -TypeName PSObject
$ datum1 | Add-Member -MemberType NoteProperty -Name Index -Value "1"
$ datum1 | Add-Member -MemberType NoteProperty -Tên cộtA -Giá trị "AA"
$datum1 | Add-Member -MemberType NoteProperty -Name ColumnB -Value "BB"
$datum1
}
hàm BBB {
$ datum2 = Đối tượng mới -TypeName PSObject
$ datum2 | Add-Member -MemberType NoteProperty -Name Index -Value "2"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA"
$datum2 | Add-Member -MemberType NoteProperty -Tên cộtC -Giá trị "CC"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnD -Value "DD"
$datum2 | Add-Member -MemberType NoteProperty -Tên cộtE -Value "EE"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnF -Value "FF"
$datum2
}
AAA |? {$ _. Chỉ mục -eq "1"} | FT
BBB | {$ _. Chỉ mục -eq "2"} | FT
Dù sao, ai đó có thể giải thích những gì đang xảy ra? Tôi thực sự muốn hiểu lý do và tìm kiếm thông tin liên quan
EDIT2: Trả lời Palle Đến hạn,
nó hoàn toàn không hoạt động đối với kịch bản của tôi vì nó thêm một chút phức tạp. Out-Hostkhông phải là một sự lựa chọn. Ví dụ được cung cấp:
quy trình làm việc Nhận báo cáo
{
param ([string []]$computername)
foreach -Parallel ($máy tính trong $computername) {
sequence {
InlineScript {
$AAA = Gọi-Lệnh -ScriptBlock {
$datum1 = New-Object -TypeName PSObject
$datum1 | Add-Member -MemberType NoteProperty -Name Index -Value "1"
$datum1 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA"
$datum1 | Add-Member -MemberType NoteProperty -Tên cộtB -Giá trị "BB"
trở về $datum1
}
$AAA | Bên ngoài Máy chủ
$BBB = Invoke-Command -ScriptBlock {
$datum2 = New-Object -TypeName PSObject
$datum2 | Add-Member -MemberType NoteProperty -Name Index -Value "2"
$datum2 | Add-Member -MemberType NoteProperty -Tên cộtA -Giá trị "AA"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnC -Value "CC"
$datum2 | Add-Member -MemberType NoteProperty -Tên cộtD -Giá trị "DD"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnE -Value "EE"
$datum2 | Add-Member -MemberType NoteProperty -Tên cộtF -Value "FF"
trở về $datum2
}
$BBB | Bên ngoài Máy chủ
} #endinlinescript
} #endsequence
} #endforeach
} #endWF
$results = @()
$results = Get-Report -Verbose -Computer "localhost", "localhost"
$ kết quả | FT
Trả lời
Cách khắc phục dễ dàng là chuyển đầu ra thành Out-Host:
function AAA {
$datum1 = New-Object -TypeName PSObject $datum1 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA"
$datum1 | Add-Member -MemberType NoteProperty -Name ColumnB -Value "BB" return $datum1
}
function BBB {
$datum2 = New-Object -TypeName PSObject $datum2 | Add-Member -MemberType NoteProperty -Name ColumnA -Value "AA"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnC -Value "CC" $datum2 | Add-Member -MemberType NoteProperty -Name ColumnD -Value "DD"
$datum2 | Add-Member -MemberType NoteProperty -Name ColumnE -Value "EE" $datum2 | Add-Member -MemberType NoteProperty -Name ColumnF -Value "FF"
return $datum2
}
AAA | Out-Host
BBB | Out-Host
đưa ra đầu ra:
ColumnA ColumnB
------- -------
AA BB
ColumnA : AA
ColumnC : CC
ColumnD : DD
ColumnE : EE
ColumnF : FF
Vấn đề là powershell thích xuất các đối tượng tùy chỉnh có bốn thành viên trở xuống theo chiều ngang. Với năm thành viên trở lên, chúng được xuất theo chiều dọc. Và sau đó, một số nguyên tắc về sự gọn gàng kỳ lạ bắt đầu: Nếu bạn xuất nhiều đối tượng liên tiếp, powershell sẽ cố gắng giữ cùng một định dạng. Vì vậy, nếu bạn bắt đầu theo chiều ngang, nó sẽ tiếp tục theo chiều ngang và chỉ xuất các thành viên có cùng tên với đối tượng tùy chỉnh đầu tiên. Nếu bạn bắt đầu theo chiều dọc, nó sẽ tiếp tục theo chiều dọc và xuất ra tất cả các tên.
Đó là lý do tại sao nếu bạn đi:
BBB
AAA
bạn sẽ nhận được
ColumnA : AA
ColumnC : CC
ColumnD : DD
ColumnE : EE
ColumnF : FF
ColumnA : AA
ColumnB : BB
thay thế.
Tôi không thể tìm thấy bất kỳ tài liệu nào cho việc này. Chúng chỉ là quan sát của riêng tôi.