что испускает материал заголовка, когда я отображаю запись каталога? - PullRequest
0 голосов
/ 30 июля 2011

Стыдно признаться, но после работы с Monad, когда она была в бета-версии, с тех пор я как-то пренебрегал PowerShell.Так что я только сейчас окунаю свои пальцы.

Я хотел, чтобы функция раскрасила список каталогов, и я нашел ее в Интернете:

function LL {
    param ($dir = ".", $all = $false)

    $origFg = $host.ui.rawui.foregroundColor
    if ( $all ) { $toList = ls -force $dir }
    else { $toList = ls $dir }

    foreach ($Item in $toList)  {
        Switch ($Item.Extension)  {
            ".Exe" {$host.ui.rawui.foregroundColor = "Yellow"}
            ".cmd" {$host.ui.rawui.foregroundColor = "Red"}
            ".msh" {$host.ui.rawui.foregroundColor = "Red"}
            ".vbs" {$host.ui.rawui.foregroundColor = "Red"}
            Default {$host.ui.rawui.foregroundColor = $origFg}
        }
##        if ($item.Mode.StartsWith("d")) {$host.ui.rawui.foregroundColor = "White"}
        if ($item.PSIsContainer) {$host.ui.rawui.foregroundColor = "White"}
        $item
    }
    $host.ui.rawui.foregroundColor = $origFg
}

Единственная проблема заключается в том, что материал заголовкав полученном отображении всегда отображается цвет, назначенный первой записи в каталоге.

Поэтому я решил взглянуть на массив, присвоенный переменной $ tolist:

09:47:10|# $tolist = ls
09:47:26|# $tolist[0]


    Directory: D:\Documents and Settings\200018252


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----         7/15/2011   8:15 AM            .ssh


09:47:37|# $tolist[9]


    Directory: D:\Documents and Settings\200018252


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----         3/10/2011   1:14 PM            vimperator


09:48:19|#

Итак, когдаДля каждого элемента $ tolist предваряется пустой строкой, затем одна показывает каталог, другая пустая строка, а затем заголовки столбцов.

Мне нужно контролировать цвет переднего плана для этой информации.Что его излучает?

Ответы [ 3 ]

0 голосов
/ 01 августа 2011

Очень хакерский способ получить цвет заголовка (я ждал, чтобы увидеть, если кто-то опубликует что-то, что не было взломом, как этот, но так как никто не опубликовал, вот мое решение):

$dummy = "justadummynametoaddtothebeginningofthelistofitems"
$headerColor = "green"

function LL {
    param ($dir = ".", $all = $false)

    new-object System.IO.FileInfo $dummy

    $origFg = "white"
    if ( $all ) { $toList = ls -force $dir }
    else { $toList = ls $dir }

    foreach ($Item in $toList)  {
        Switch ($Item.Extension)  {
            ".Exe" {$host.ui.rawui.foregroundColor = "Yellow"}
            ".cmd" {$host.ui.rawui.foregroundColor = "Red"}
            ".msh" {$host.ui.rawui.foregroundColor = "Red"}
            ".vbs" {$host.ui.rawui.foregroundColor = "Red"}
            Default {$host.ui.rawui.foregroundColor = $origFg}
        }
##        if ($item.Mode.StartsWith("d")) {$host.ui.rawui.foregroundColor = "White"}
        if ($item.PSIsContainer) {$host.ui.rawui.foregroundColor = "White"}
        $item
    }
    $host.ui.rawui.foregroundColor = $origFg
}

function CheckDummy{
param($name,$otherProp) 
    $origFg = $host.ui.rawui.foregroundColor
    if($name -ne $dummy){
        $host.ui.rawui.foregroundColor = $origFg
        $otherProp
    }
    else{
    $host.ui.rawui.foregroundColor = $headerColor
    $null
    }

}

function LLNew{

$a = @{Name="Mode";Expression = {CheckDummy $_.Name $_.Mode; }},
     @{Name="LastWriteTime";Expression = {CheckDummy $_.Name $_.LastWriteTime}},
     @{Name="Length";Expression = {CheckDummy $_.Name$_.Length}},
     @{Name="Name";Expression = {CheckDummy $_.Name $_.Name}}

LL | ft $a
}

Наверное, не стоит получать цвет заголовка, но пришлось попробовать:)

Кстати, более простой способ получить окраску, как вы хотите, как показано ниже:

ls | %{

 if($_.extension -match ".exe"){
        [console]::ForegroundColor="green"; $_;
 } else {
        [console]::ForegroundColor="white"; $_;
 }

}
0 голосов
/ 01 августа 2011

Работа в процессе ...

Это обрабатывается системой форматирования типов PowerShell.Определения для них хранятся в файлах XML.Вы можете изменить эти правила форматирования, используя следующие шаги.

Сначала получите копию текущих правил.Вы можете использовать два метода.

## 1, export the rules (but the result will not be nicely formatted XML, so needs some cleanup)
Get-FormatData -TypeName FileSystemTypes | Export-FormatData test.format.ps1xml

## 2, grab the source XML directly (be sure to remove the signature from the bottom of the file)
Copy-Item C:\Windows\System32\WindowsPowerShell\v1.0\FileSystem.format.ps1xml .

Далее нам нужно изменить правила для раскраски.(Мне нужно вернуться к этому, как только я выясню, какие изменения необходимы).

## TODO: modify the formatting from controls to direct host output

Наконец, наш профиль обновляет данные формата при загрузке PowerShell.

Update-FormatData -PrependPath test.format.ps1xml
0 голосов
/ 30 июля 2011

Что будет, это будет одна из команд format- *, либо format-table, либо format-list, в зависимости от типа объекта и количества свойств в наборе элементов по умолчанию.

Используется таблица форматирования до определенного числа членов, а затем возвращается к формату списка, если их слишком много для таблицы форматирования (я не помню, где установлено это пороговое число). Свойства, включенные в набор элементов по умолчанию, определены в файле types.ps1xml:

http://technet.microsoft.com/en-us/library/dd347581.aspx

Вы можете изменить этот файл, но, как представляется, нет никаких условий для указания цветов экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...