PowerShell PSObject путаница между -pass & -passthru
function getinfo {
$strComputer = "localhost"
$colItems = GWMI -cl "Win32_NetworkAdapterConfiguration" -name "root\CimV2" -comp $strComputer -filter "IpEnabled = TRUE"
$Items1 = $colItems | Select DHCPServer, Caption, DNSHostName, IPAddress
$Items2 = $colItems | Select ServiceName, MacAddress, IPSubnet, InterfaceIndex
}
$objects = (New-Object PSObject |
add-member -pass NoteProperty "DHCP Server" $Items1.DHCPServer |
add-member -pass NoteProperty "IP Address" $Items1.IPAddress |
add-member -passthru NoteProperty "Mac Address" $Items2.MacAddress |
add-member -passthru NoteProperty "IP Subnet" $Items2.IPSubnet
)
$objects | ConvertTo-Json
Я смущен -pass
& -passthru
ключи. Какая разница, и почему ничто не заселяется, когда -passthru
используется для $Items1
?
1 ответ
Решение
Вопрос не с -pass
или же -passthru
, Проблема заключается в том, что переменные, созданные внутри функции, обычно доступны только во время работы этой функции. Из справки для about_Scopes:
Windows PowerShell защищает доступ к переменным, псевдонимам, функциям и дискам Windows PowerShell (PSDrives), ограничивая возможности их чтения и изменения.
Если вы вызываете функцию с помощью точечного источника, вы можете оставить переменные доступными для использования в New-Object
команда.
function getinfo {
$strComputer = "localhost"
$colItems = GWMI -cl "Win32_NetworkAdapterConfiguration" -name "root\CimV2" -comp $strComputer -filter "IpEnabled = TRUE"
$Items1 = $colItems | Select DHCPServer, Caption, DNSHostName, IPAddress
$Items2 = $colItems | Select ServiceName, MacAddress, IPSubnet, InterfaceIndex
}
. getinfo
$objects = (New-Object PSObject |
add-member -pass NoteProperty "DHCP Server" $Items1.DHCPServer |
add-member -pass NoteProperty "IP Address" $Items1.IPAddress |
add-member -passthru NoteProperty "Mac Address" $Items2.MacAddress |
add-member -passthru NoteProperty "IP Subnet" $Items2.IPSubnet
)
$objects | ConvertTo-Json