有一段时间我在使用 win7,它经常把我的键盘语言弄乱,我必须远程添加 3 种键盘语言,应用,然后删除它们。所以,我想知道是否有办法通过 .bat 文件自动完成(添加 3 种特定的键盘语言,然后立即删除它们)。但是,我对 .bat 命令几乎一无所知,所以有人知道这是否可以通过 .bat 文件实现,如果可以,我应该使用哪些命令?
提前谢谢你,乔治。
有一段时间我在使用 win7,它经常把我的键盘语言弄乱,我必须远程添加 3 种键盘语言,应用,然后删除它们。所以,我想知道是否有办法通过 .bat 文件自动完成(添加 3 种特定的键盘语言,然后立即删除它们)。但是,我对 .bat 命令几乎一无所知,所以有人知道这是否可以通过 .bat 文件实现,如果可以,我应该使用哪些命令?
提前谢谢你,乔治。
这是可能的。
http://msdn.microsoft.com/en-us/goglobal/bb964650#eyb
运行 xml 以添加键盘语言的命令行示例:
control intl.cpl,, /f:"%CD%\AddKeyboardLanguage.xml"
AddKeyboardLanguage.xml 用于添加中文键盘语言示例:
<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
<gs:UserList>
<gs:User UserID="Current" CopySettingsToDefaultUserAcct="true" CopySettingsToSystemAcct="true"/></gs:UserList>
<gs:InputPreferences>
<gs:InputLanguageID Action="add" ID="0804:{81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35E}{FA550B04-5AD7-411F-A5AC-CA038EC515D7}"/>
</gs:InputPreferences>
</gs:GlobalizationServices>
RemoveKeyboardLanguage.xml 示例:
<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
<gs:UserList>
<gs:User UserID="Current" CopySettingsToDefaultUserAcct="true" CopySettingsToSystemAcct="true"/></gs:UserList>
<gs:InputPreferences>
<gs:InputLanguageID Action="remove" ID="0804:{81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35E}{FA550B04-5AD7-411F-A5AC-CA038EC515D7}"/>
</gs:InputPreferences>
</gs:GlobalizationServices>
添加或删除键盘语言的批处理文件(另存为AddRemWindowsChinese.bat
):
@echo off
if "%1"=="" echo ERROR: Missing [add]/[remove] parameter & goto :USAGE
if /i %1==add (
echo control intl.cpl,, /f:"%CD%\AddWindowsChinese.xml"
control intl.cpl,, /f:"%CD%\AddWindowsChinese.xml"
IF ERRORLEVEL 1 echo An error occured ! && goto :ERROR
)
if /i %1==remove (
echo %CD%
echo control intl.cpl,, /f:"%CD%\RemoveWindowsChinese.xml"
control intl.cpl,, /f:"%CD%\RemoveWindowsChinese.xml"
IF ERRORLEVEL 1 echo An error occured ! && goto :ERROR
)
GOTO :END
:USAGE
echo.
echo USAGE:
echo AddRemWindowsChinese.bat [add ^| remove]
echo.
pause
goto :END
:ERROR
:END
我也遇到了同样的问题 -en-US
是自动添加的,我必须添加en-US
然后删除它才能摆脱布局。即使使用批处理文件,我发现您不能只删除它,您必须先添加布局(即使它显示在键盘布局列表中)才能像手动操作一样将其删除。
因此,该Remove_en-US.xml
文件首先添加布局,然后将其删除:
<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
<!--User List-->
<gs:UserList>
<gs:User UserID="Current"/>
</gs:UserList>
<!--input preferences-->
<gs:InputPreferences>
<!--add en-US keyboard input-->
<gs:InputLanguageID Action="add" ID="0409:00000409"/>
<!--remove en-US keyboard input-->
<gs:InputLanguageID Action="remove" ID="0409:00000409"/>
</gs:InputPreferences>
</gs:GlobalizationServices>
Remove_en-US.bat
:
control intl.cpl,, /f:"%CD%\Add_en-US.xml"
这里,0409
是locale ID
并且00000409
是键盘布局值。有关列表,locale ID:keyboard layout value
请参阅https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-8.1-and-8/hh825682(v=win.10)。
使用@Ying 提示/链接...我制作了一个pt.xml
文件:
<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
<!--User List-->
<gs:UserList>
<gs:User UserID="Current"/>
</gs:UserList>
<!--input preferences-->
<gs:InputPreferences>
<!--add pt-BR keyboard input and set as default-->
<gs:InputLanguageID Action="add" ID="0416:00010416" Default="true"/>
</gs:InputPreferences>
</gs:GlobalizationServices>
然后在.bat
里面用这个命令创建一个:
control intl.cpl,, /f:"%CD%\pt.xml"
双击它,它应该立即工作!
键盘语言存储在注册表中,HKEY_CURRENT_USER\Keyboard Layout
您可以REG.EXE
在批处理文件中使用以添加/修改/删除注册表项。REG.EXE
不支持远程更改HKEY_CURRENT_USER
注册表项,因此必须从相关计算机运行文件。不过,我们可能不必这样做。这就是我会做的。当您的计算机正常工作时,CMD
通过单击开始按钮并CMD
在运行框中键入来转到提示。在CMD
提示符下,键入:
REG QUERY "HKCU\Keyboard Layout" /s
这将向您展示一切正常时注册表项的外观。现在对其进行快照并将其存储在文件中,方法是键入:
REG EXPORT "HKCU\Keyboard Layout" KeyboardLayout.reg
这将在CMD
提示说明的任何目录中创建 KeyboardLayout.reg 文件。我不确定为什么您必须添加 3 种特定语言,然后将它们删除才能恢复正常工作,但我觉得只需将注册表设置回它工作时的状态就可以解决问题。下次发生这种情况时,远程浏览到 KeyboardLayout.reg 文件的位置并双击它。它会告诉您密钥已更新并单击确定。看看能不能解决。如果没有,请重新启动该计算机,然后查看是否有。如果它仍然不起作用,请回复评论,我会告诉你下一步我会做什么。
还有一种powershell方法。这是删除 en-US 和 de-DE 布局的简单批处理
@echo off
for %%q in (en-US de-DE) do ^
powershell -c "$ll=Get-WinUserLanguageList; $ll.add('%%q'); Set-WinUserLanguageList $ll -force;" & ^
powershell -c "$ll=Get-WinUserLanguageList; $ll.remove(($ll |? LanguageTag -like '%%q')); Set-WinUserLanguageList $ll -force;"
首先我们必须添加它们,然后删除它们。对我来说很好。