Como posso obter a localidade do sistema no Windows 7?
Quero dizer algo como: cs_CZ.UTF-8
Eu tentei escrever "locale" na linha de comando, mas isso não funciona no Windows. Alguma sugestão?
Como posso obter a localidade do sistema no Windows 7?
Quero dizer algo como: cs_CZ.UTF-8
Eu tentei escrever "locale" na linha de comando, mas isso não funciona no Windows. Alguma sugestão?
Respostas:
Não existe um comando específico (ou pelo menos um que eu saiba) para obter essas informações, mas você pode encontrá-las entre as fornecidas por systeminfo.exe
.
systeminfo.exe
por si só funciona, assim como a resposta do gWaldo no PS
Se você precisar que o código do idioma real faça outras coisas condicionalmente em um arquivo em lotes, poderá criar um arquivo em lotes (salvar um arquivo de texto como extensão .bat) com o seguinte. Como ponto de partida, isso será impresso no prompt de comando, por exemplo, "en-us" (sem aspas) Você também pode usar a variável! VERBOSE_SYSTEM_LOCALE! para o local legível por humanos, por exemplo, inglês (Estados Unidos)
@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!
)
)
De fato, suas propostas falham porque dependem da pesquisa de uma string (" Localização do Sistema ") que muda dependendo da localidade atual! No meu Win10Pro francês, a string é " Option régionale du système " (com letra acentuada, que é muito difícil de manusear corretamente em um arquivo CMD).
Eu fiz alguns testes e parece, no MEU sistema, que as linhas sobre a localidade na saída systeminfo são as únicas que contêm um caractere ponto-e-vírgula (";"):
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)
Com base nisso (o que NÃO pode ser verdade em outros sistemas com idiomas diferentes), codifiquei esse script 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
)
)
O resultado do meu script no MEU sistema é:
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)
Entretanto, esteja avisado de que as três variáveis de ambiente existem apenas dentro do script, elas NÃO persistem no ambiente CMD após o término do script (nenhum comando de exportação como no * nix).
eu de novo.
Eu descobri um leve aprimoramento no meu script. Usando o SETX, pode-se armazenar variáveis de ambiente no ambiente USER para futuras janelas CMD (como indicado em SETX /? Segundo comentário).
Em seguida, o script get_locale.cmd se torna:
@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
)
)
Para a variável VERBOSE_SYSTEM_LOCALE, como o valor possui possivelmente várias palavras, é necessário agrupar %% C entre aspas para que o SETX receba apenas um parâmetro conforme o esperado.
Agora, em qualquer nova janela do CMD, esses valores estarão disponíveis:
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: Seria bom se outros colaboradores de outros países com outros idiomas pudessem confirmar que procurando por ponto-e-vírgula ';' funciona em seus sistemas Windows. Desde já, obrigado!
System Locale: en-gb;English (United Kingdom)