Как получить языковой стандарт системы в Windows 7?
Я имею в виду что-то вроде: cs_CZ.UTF-8
Я пробовал написать «локаль» в командной строке, но в Windows это не работает. Какие-либо предложения?
Нет конкретной команды (или, по крайней мере, той, о которой я знаю) для получения этой информации, но вы можете найти ее между командами, предоставленными systeminfo.exe
.
Get-UICulture
или Get-Host
в PowerShell
(использование заглавных букв необязательно)
Если вам нужен фактический языковой стандарт для условного выполнения других действий в пакетном файле, вы можете создать пакетный файл (сохранить текстовый файл с расширением .bat) следующим образом. В качестве отправной точки в командной строке будет напечатано, например, «en-us» (без кавычек). Вы также можете использовать переменную! VERBOSE_SYSTEM_LOCALE! для удобочитаемого языка, например Английский Соединенные Штаты)
@echo off
setlocal EnableDelayedExpansion
FOR /F "delims==" %%G IN ('systeminfo.exe') Do (
set input=%%G
for /l %%a in (1,1,100) do if "!input:~-1!"==" " set input=!input:~0,-1!
IF "!input:~0,13!"=="System Locale" (
set answer=!input:~15!
set answer=!answer: =!
set VERBOSE_SYSTEM_LOCALE=!answer:*;=!
call set SYSTEM_LOCALE_WITH_SEMICOLON=%%answer:!VERBOSE_SYSTEM_LOCALE!=%%
set SYSTEM_LOCALE=!SYSTEM_LOCALE_WITH_SEMICOLON:~0,-1!
echo !SYSTEM_LOCALE!
)
)
Фактически, ваши предложения терпят неудачу, потому что они основаны на поиске строки ("Системный языковой стандарт"), который меняется в зависимости от текущего языкового стандарта! На моем французском Win10Pro строка"Вариант régionale du système"(с диакритическими буквами, что очень сложно правильно обработать в файле CMD).
Я провел некоторое тестирование, и в МОЕЙ системе кажется, что строки о локали в выводе systeminfo - единственные, которые содержат символ точки с запятой (";"):
24/09/2017 17:18:43,23 | C:\CMD ()
> systeminfo | findstr ;
Option régionale du système: fr;Français (France)
Paramètres régionaux d'entrée: fr;Français (France)
Исходя из этого (что может НЕ быть правдой в других системах с другими языками), я закодировал это get_locale.cmd сценарий:
@echo off
setlocal EnableDelayedExpansion
FOR /F "delims==" %%A IN ('systeminfo.exe ^| findstr ";"') do (
FOR /F "usebackq tokens=2-3 delims=:;" %%B in (`echo %%A`) do (
set VERBOSE_SYSTEM_LOCALE=%%C
REM Removing useless leading spaces ...
FOR /F "usebackq tokens=1 delims= " %%D in (`echo %%B`) do (
set SYSTEM_LOCALE=%%D
)
set SYSTEM_LOCALE_WITH_SEMICOLON=!SYSTEM_LOCALE!;
set | findstr /I locale
REM No need to handle second line, quit after first one
goto :EOF
)
)
Результат моего скрипта в МОЕЙ системе:
24/09/2017 17:18:45,31 | C:\CMD ()
> get_locale.cmd
SYSTEM_LOCALE=fr
SYSTEM_LOCALE_WITH_SEMICOLON=fr;
VERBOSE_SYSTEM_LOCALE=Français (France)
Однако имейте в виду, что три переменные среды существуют только внутри сценария, они НЕ сохраняются в среде CMD после завершения сценария (нет экспорт как в * nix).
мне еще раз.
Я обнаружил небольшое улучшение в моем сценарии. Используя SETX, можно хранить переменные среды в среде USER для будущее CMD Windows для использования (как указано в SETX /? второе замечание).
Затем get_locale.cmd сценарий становится:
@ECHO OFF
SETLOCAL EnableDelayedExpansion
FOR /F "delims==" %%A IN ('systeminfo.exe ^| findstr ";"') DO (
FOR /F "usebackq tokens=2-3 delims=:;" %%B IN (`echo %%A`) DO (
SET VERBOSE_SYSTEM_LOCALE=%%C
setx VERBOSE_SYSTEM_LOCALE "%%C" 1>NUL
REM Removing useless leading spaces ...
FOR /F "usebackq tokens=1 delims= " %%D IN (`echo %%B`) DO (
SET SYSTEM_LOCALE=%%D
setx SYSTEM_LOCALE %%D 1>NUL
)
SET SYSTEM_LOCALE_WITH_SEMICOLON=!SYSTEM_LOCALE!;
setx SYSTEM_LOCALE_WITH_SEMICOLON !SYSTEM_LOCALE!; 1>NUL
SET | findstr /I locale
REM No need to handle second line, quit after first one
GOTO :EOF
)
)
Для переменной VERBOSE_SYSTEM_LOCALE, поскольку значение, возможно, состоит из нескольких слов, необходимо заключить %% C в кавычки, чтобы SETX получил только один параметр, как ожидалось.
Теперь в любом новый В окне CMD будут доступны следующие значения:
16/12/2017 2:00:46 | C:\Users\Seagram ()
>set | findstr /i locale
SYSTEM_LOCALE=fr
SYSTEM_LOCALE_WITH_SEMICOLON=fr;
VERBOSE_SYSTEM_LOCALE=Français (France)
PS: Было бы хорошо, если бы другие участники из других стран с другими языками могли подтвердить, что ищут точку с запятой ';' работает в их системах Windows. Заранее спасибо!