【问题标题】:Questions/Problems related to set-winuserlanguagelist command与 set-winuserlanguagelist 命令相关的问题/问题
【发布时间】:2018-03-05 09:31:49
【问题描述】:

我正在构建一个代码来修复 Windows 10 上的键盘布局情况。通过自动化解决方案,我决定使用 powershell。但问题是我对它很陌生并且面临某些问题。我设法挖掘了一个脚本来更改键盘布局,但是它只更改为一种语言。当我尝试用 2 种语言创建数组时:

$langlist=$lang_en,$lang_ru
set-winuserlanguagelist $langlist

它只是返回我下一个错误:

Set-WinUserLanguageList : Cannot convert 'Microsoft.InternationalSettings.Commands.WinUserLanguage' to the type
'Microsoft.InternationalSettings.Commands.WinUserLanguage' required by parameter 'LanguageList'. Specified method is
not supported.
At line:1 char:25
+ set-winuserlanguagelist $langlist
+                         ~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-WinUserLanguageList], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.InternationalSettings.Commands.SetWinUserLanguageListCommand

当我尝试使用下一个命令:$test = Get-WinUserLanguageList 时,该命令与set-winuserlanguagelist 配合得很好。

完整的脚本:

$keys='0809:00020409', '0419:00000419'

$lang_en=new-winuserlanguagelist en-gb
$lang_en[0].inputmethodtips.clear()
$lang_en[0].inputmethodtips.add($keys[0])

$lang_ru=new-winuserlanguagelist ru
$lang_ru[0].inputmethodtips.clear()
$lang_ru[0].inputmethodtips.add($keys[1])

$langlist=$lang_en,$lang_ru

set-winuserlanguagelist $langlist

【问题讨论】:

  • 问题不再实际。问题背后的原因是变量的类型。我以错误的方式宣布它。正确的方法是:$langlist = New-Object "System.Collections.Generic.List[Microsoft.InternationalSettings.Commands.WinUserLanguage]"
  • 真正的问题是您创建了一个 lists 数组,而不是 [Microsoft.InternationalSettings.Commands.WinUserLanguage] 实例数组。 New-WinUserLanguageList cmdlet 的笨拙设计应归咎于此,这仍然值得在答案中解决。
  • P.S.:顺便说一句,请允许我给你一个语言提示:“实际”可能是指“不再相关”。 "actual" means something closer to "real"
  • 感谢您的解释。当我试图更多地理解错误时,我理解了这个问题。创建一个列表列表解决了这个问题,并且 cmdlet 可以根据我的需要工作。是的,想结束问题,但不知道如何。但至少人们花时间向我解释事情,我真的很感激
  • 很高兴听到这个消息。万一这不仅仅是一个错字:它不是创建一个解决问题的 lists 列表,而是一个 WinUserLanguage 实例列表 - 这是 New-WinUserLanguageList 应该 允许您使用 多种 语言 - 但目前不允许。至于结束你的问题:你可以 delete 它,但是 - 在这种情况下 - 当答案已经发布时这不是一个好主意(并且,如前所述,你的问题很有用,因为其他人可能犯同样的错误)。

标签: powershell


【解决方案1】:

请检查以下注释代码sn-ps:

PS D:\PShell> ### Type mismatch

$langlist=$lang_en,$lang_ru

### Note the difference in type:

$langlist.gettype().Name                   ### Object[]

(Get-WinUserLanguageList).gettype().Name   ### List`1
Object[]
List`1
PS D:\PShell> ### Use the following:

$langlist = Get-WinUserLanguageList
$langlist.Clear()
$langlist.Add($lang_en[0])
$langlist.Add($lang_ru[0])

$langlist.gettype().Name                   ### List`1
List`1
PS D:\PShell> <### The next cmdlet should work now:

set-winuserlanguagelist $langlist

<##>

【讨论】:

    【解决方案2】:

    问题在于你使用New-WinUserLanguageList两次每个调用返回一个列表,所以$langlist = $lang_en, $lang_ru错误地创建了一个数组(单项)列表,而不是包含两个项的单个列表,这导致了(听起来很荒谬)类型-您看到的不匹配错误。

    非常尴尬,然而,cmdlet New-WinUserLanguageList 只允许您指定 一种 语言,即使它返回 list 类型(@ 987654324@).

    也就是说,以下应该起作用,但不起作用:

    # Try to create the list with *2* entries
    $langlist = New-WinUserLanguageList en-gb, ru  # !! Doesn't work, parameter type is [string]
    

    相反,您必须使用.Add() 方法1语言初始化,然后稍后添加其他语言

    # Create the list with initially just 'en-gb'...
    $langlist = New-WinUserLanguageList en-gb
    
    # ... and then add the other language, 'ru'
    # Because the list is strongly typed, it is sufficient to pass the language
    # identifier, which implicitly creates a new
    # [Microsoft.InternationalSettings.Commands.WinUserLanguage] instance.
    $langlist.Add('ru')
    
    # Now you can modify the properties of $langlist[0] (en-gb)
    # and $langlist[1] (ru)
    # ...
    
    # ... and pass the list of modified languages to Set-WinUserLanguageList:
    Set-WinUserLanguageList $langlist
    

    或者,为了避免.Add() 调用,您可以使用

    $langlist = (New-WinUserLanguageList en-gb)[0], (New-WinUserLanguageList ru)[0]
    

    尽管$langlist 在技术上是一个数组(一个[System.Object[]] 实例,其元素的类型为Microsoft.InternationalSettings.Commands.WinUserLanguage),但将其传递给Set-WinUserLanguageList 仍然有效,因为它是隐式 转换为所需的列表类型。

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2017-08-12
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多