Использование двух массивов для создания ключей / значений реестра - PullRequest
2 голосов
/ 15 мая 2019

Попытка автоматизировать процесс установки шрифтов для новых компьютеров.

Для установки шрифтов Windows добавляет файл .ttf, .otf и т. Д. В C: \ Windows \ Fonts, а затем создает соответствующий ключ реестра.в HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Fonts.Типичный раздел реестра будет выглядеть так:

Arial (TrueType) |Arial.ttf

Чтобы автоматизировать это, я создал два массива с использованием Get-ChildItem:

$names = Get-ChildItem -Path "C:\corp\install\fonts" | Select-Object name | Out-String | ForEach-Object {$_ -Replace "----","" ` -Replace "Name","" ` -Replace ".otf","" ` -Replace ".ttf","" } | ForEach-Object { $_.Trim() }
$files = Get-ChildItem -Path "C:\corp\install\fonts" | Select-Object name | Out-String | ForEach-Object {$_ -Replace "----","" ` -Replace "Name","" } | ForEach-Object { $_.Trim() }

Каждый $ name в $ names будет именем раздела реестра, а каждый$ file в $ files будет данными для этого ключа реестра.

Как мне поступить?Я пытался использовать хеш-таблицы, PSObjects, вложенные циклы ForEach, но все безрезультатно.Мне было трудно найти что-то здесь и в других местах, точно соответствующее этой ситуации.

Проверка ошибок на самом деле не нужна, поскольку всегда будет соответствующее значение.

ПЕРЕСМОТРЕННОЕ ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ:

Write-Host "Installing corporate fonts..."
Copy-Item -Path "C:\corp\install\fonts\*" -Destination "C:\Windows\Fonts" -Force -Recurse

$fontList = @()

$fonts = Get-ChildItem "C:\corp\install\fonts" | Select-Object -ExpandProperty Name

ForEach ( $font in $fonts ) {

    $fontList += [PSCustomObject] @{ 
        Name = $font -Replace ".otf","" ` -Replace ".ttf",""
        File = $font
    } |

    ForEach-Object {
        New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" -Name $_.Name -Value $_.File
    }
}

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Передача как имени, так и значения в set-itemproperty представляется невозможной.Foreach-объект, кажется, подходит.

$path = 'hklm:\software\microsoft\windows nt\currentversion\fonts' 

[pscustomobject]@{name='a name';value='a value'} | 
  foreach { set-itemproperty $path $_.name $_.value -whatif }

What if: Performing the operation "Set Property" on target "Item: HKEY_LOCAL_MACHINE\software\microsoft\windows nt\currentversion\fonts Property: a name".

Вы можете использовать этот vbscript-подобный метод для установки шрифтов:

https://www.mondaiji.com/blog/other/it/10247-windows-install-fonts-via-command-line

0 голосов
/ 15 мая 2019

Должен признаться, я не до конца понимаю ваш вопрос, так что простите, если этот ответ далек от базы, но это то, что вы ищете? Таблица с двумя частями данных в одном?

Function CreateVariables {

    $namevariables = @()

    $filenames = ( Get-ChildItem "C:\corp\install\fonts" ).name 

    Foreach ( $name in $filenames ){

        $namevariables += [PSCustomObject] @{ 
            Name = $name -Replace "----","" ` -Replace "Name","" ` -Replace ".otf","" ` -Replace ".ttf","" 
            File = $name -Replace "----","" ` -Replace "Name",""
        }
    }

    Return $namevariables
}

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