Проблемы программы Powershell - PullRequest
2 голосов
/ 10 марта 2011

У меня проблема с моим кодом.Я хочу перечислить скрытые и не скрытые акции.Я должен сделать это, используя структуру if / else.Кажется, моя проблема в массивах $ HiddenShares и $ NonHiddenShares.Я хочу, чтобы в списке были заголовки «Скрытые акции» и «Скрытые акции», за которыми следуют акции, каждая из которых находится на отдельной строке.

Пример:

Скрытые акции

Видео $

Музыка $

Не скрытые акции

Телевизор $

Фотографии $

Вот мой код:

$Shares = Get-WmiObject Win32_Share

$HiddenShares =""

$NonHiddenShares =""

Foreach($_ in $Shares)

{

    If($_ | Where-Object {$_.Name -like "*$"})

        {
        $HiddenShares += $_.Name
    }
    Else
    {
        $NonHiddenShares += $_.Name
    }
}
Write-Host "Hidden Shares"

Write-Host $HiddenShares 

Write-Host "Non-hidden Shares"

Write-Host $NonHiddenShares

1 Ответ

3 голосов
/ 10 марта 2011

В вашем примере кода есть несколько проблем.$ _ - это автоматическая переменная.Правильный способ использования:

$shares | ForEach-Object {
    if ($_.Name -like "*$") {
        #Do Something
    } else {
        #Do something else
    }
}

или

foreach ($share in $shares) {
     if ($share.Name -like "*$") {
        #Do Something
     } else {
        #Do Something else
     }
}

Делая что-то вроде $HiddenShares += $_.Name, вы на самом деле объединяете строки.Очень грязный способ исправить это: $ HiddenShares + = "` n $ ($ _. Name) ".

Кроме того, в операторе if вы можете напрямую получить свойство.Вам не нужно использовать Where-Object.

Итак, ваш код будет выглядеть так:

$Shares = Get-WmiObject Win32_Share
$HiddenShares =""
$NonHiddenShares =""
Foreach($share in $Shares)
{
    If($share.Name -like "*$")
        {
            $HiddenShares += "`n$($share.Name)"
        }
        Else
        {
            $NonHiddenShares += "`n$($share.Name)"
        }
}
Write-Host "Hidden Shares"
Write-Host $HiddenShares 

Write-Host "`nNon-hidden Shares"
Write-Host $NonHiddenShares

Другое решение может быть:

$shares = Get-WmiObject Win32_Share

$objShares = @{}
$hiddenShares = @()
$nonHiddenShares = @()
$shares | ForEach-Object {
    if ($_.Name -like "*$") {
        $hiddenShares += $_.Name
    } else {
        $nonHiddenShares += $_.Name
    }
}

$objShares.Add("Hidden Shares",$hiddenShares)
$objShares.Add("Non-hidden Shares",$nonHiddenShares)
$objShares

Это вернет что-токак:

Name                           Value                                               
----                           -----                                               
Hidden Shares                  {ADMIN$, C$, IPC$}                                  
Non-hidden Shares              {}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...