Мне нужно создать скрипт PowerShell, который будет восстанавливать языковые настройки и методы ввода (важно) из файла. Сначала я подумал, что будет легко использовать Get-WinUserLanguageList | Export-CliXML ./mylist.xml
для сохранения текущих настроек, а затем $List = Import-CliXML ./mylist.xml
, Set-WinUserLanguageList -LanguageList $List
, однако это не работает, потому что данные, импортированные из XML в переменную, десериализованы, и я получаю исключение:
Set-WinUserLanguageList: Невозможно связать параметр 'LanguageList'. Не удалось преобразовать значение «Microsoft.InternationalSettings.Commands.WinUserLanguage» типа «Deserialized.Microsoft.InternationalSettings.Commands.WinUserLanguage» в тип «Microsoft.InternationalSettings.Commands.WinUserLanguage".
Я пытался использовать XMLно не удалось, поэтому я создал обходной путь, который выглядит следующим образом:
[CmdletBinding()]
param (
[switch]$GenerateList
)
function Generate-List { # Generates language files to restore from.
$GoodList = Get-WinUserLanguageList
[string[]]$LanguageTags = $GoodList.LanguageTag
$LanguageTags | Out-File .\LanguageTags.txt
[string[]]$InputMethods = $GoodList.InputMethodTips
$InputMethods | Out-File .\InputMethods.txt
} # Exporting languages and corresponding input methods in separate files. Can be improved.
if ($GenerateList -eq $true) {
Generate-List
} # Invokes a function based on a switch parameter.
function RestoreFrom-List {
$GoodList = Get-WinUserLanguageList # Make our variable of a proper type
$GoodList.Clear() # Clear the variable contents
[string[]]$LanguageTags = Get-Content .\LanguageTags.txt
[string[]]$InputMethods = Get-Content .\InputMethods.txt
foreach ($language in $LanguageTags) { # This loop fills $GoodList with proper values
$index = $LanguageTags.IndexOf($language)
$GoodList.Add($language) # Add a language to the list
$GoodList[$index].InputMethodTips.Clear() # Remove default input method
$GoodList[$index].InputMethodTips.Add($InputMethods[$index]) # Add an input method from a corresponding position in the saved txt file
}
Set-WinUserLanguageList $GoodList -force # Restore system languages and input methods using a freshly created list
}
RestoreFrom-List
Я новичок в PowerShell, и я уверен, что этот код уродлив и может быть улучшен. Кроме того, кажется, что с командлетами * -WinUserLanguageList работать очень сложно - нужно использовать внутренние методы для изменения данных вместо универсальных Set-Property
.
Пока мой скрипт успешно экспортирует language / input-methodнастройки в два (!) файла txt (!!) и не работает, если у определенного языка есть два или более методов ввода (потому что он сбрасывает методы ввода в массив, не связывая их с конкретным языком, а затем извлекает их на основеиндекс). Пожалуйста, помогите улучшить это.