Как преобразовать значение% USERNAME% в нижний регистр в пакете Windows script?

Я автоматизирую некоторые функции программного обеспечения для управления версиями с помощью точки bat script, но учитывая, что наши svn-репозитории размещаются в ящике * NIX, я столкнулся с проблемой вечного случая между этими двумя мирами.

Есть ли какая-либо функция cmd.exe для преобразования значения системной переменной Windows% USERNAME% в нижний регистр?

Большое спасибо!

Ответ 1

быстрый поиск Google this...

@echo off
goto :end_remarks
*************************************************************************************
*
*
*    authored:Sam Wofford
*    Returns lowercase of a string
*    12:13 PM 11/13/02
**************************************************************************************
:end_remarks
setlocal
set errorlevel=-1
if {%1}=={} echo NO ARG GIVEN&call :Help &goto :endit
if {%1}=={/?} call :Help &goto :endit
call :set_LCASE_array a b c d e f g h i j k l m n o p q r s t u v w x y z

:start
set input=%1
set input=%input:"=%
set totparams=0
call :COUNT_PARAMS %input%
call :MAKE_LOWERCASE %input%
set errorlevel=
echo %convertedstring%
endlocal
goto :eof
:endit
echo %errorlevel%
endlocal
goto :eof

:MAKE_LOWERCASE
:nextstring
if {%1}=={} goto :eof
set string=%1
set /a params+=1
set STRINGCONVERTED=
set pos=0
:NEXT_CHAR
set onechar=%%string^:^~%pos%,1%%
for /f "tokens=1,2 delims==" %%a in ('set onechar') do for /f %%c in ('echo %%b') do call :checkit %%c
if not defined STRINGCONVERTED goto :NEXT_CHAR
shift /1
if %params% LSS %totparams% set convertedstring=%convertedstring% &:add one space,but not at end
goto :nextstring
goto :eof

:Help
echo USAGE:%~n0 string OR %~n0 "with spaces"
echo function returns the lowercase of the string or -1 (error)
echo strings with embedded spaces needs to be in quotes Ex. "lower case"
echo in a batch NTscript "for /f %%%%A in ('lcase STRING') do set var=%%%%A"
set errorlevel=
goto :eof

:checkit
set LCFOUND=
if /i {%1}=={echo} set STRINGCONVERTED=Y&goto :eof
set char=%1
for /f "tokens=2 delims=_=" %%A in ('set LCASE_') do call :findit %%A %char%
:skipit
if defined LCFOUND (set convertedstring=%convertedstring%%ucletter%) else (set convertedstring=%convertedstring%%char%)
set /a pos+=1
goto :eof

:set_LCASE_array
:setit
if {%1}=={} goto :eof
set LCASE_%1_=%1
SHIFT /1
goto :setit

:findit
if defined LCFOUND goto :eof
set ucletter=%1
set lcchar=%2
if /i {%ucletter%}=={%lcchar%} set LCFOUND=yes
goto :eof

:COUNT_PARAMS
:COUNTPARAMS
if {%1}=={} goto :eof
set /a totparams+=1
shift /1
goto :COUNTPARAMS 

добавьте это как файл (lowercase.cmd) в свой путь, и вы сможете назвать его "Lowercase.cmd% Username%", при необходимости вы можете отправить его в другую команду.

Ответ 2

Ну, я просматривал какой-то синтаксис и наткнулся на эту страницу. Я знаю его старый, но я подумал, что сделаю перерыв и дам мозгу маленький удар.

Здесь что-то немного короче и управляемо. Это просто "грубой силы" всех прописных букв для строчных букв без учета того, существует ли фактическая буква в строке или нет. Таким образом, функциональный цикл выполняется ровно 26 раз независимо от длины строки.

Надеюсь, это поможет кому-то.

@echo off
cls
setlocal enabledelayedexpansion

REM ***** Modify as necessary for the string source. *****
set "_STRING=%*"
if not defined _STRING set "_STRING=%USERNAME%"
set _STRING
REM ***** Modify as necessary for the string source. *****

set "_UCASE=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
set "_LCASE=abcdefghijklmnopqrstuvwxyz"

for /l %%a in (0,1,25) do (
   call set "_FROM=%%_UCASE:~%%a,1%%
   call set "_TO=%%_LCASE:~%%a,1%%
   call set "_STRING=%%_STRING:!_FROM!=!_TO!%%
)

set _STRING
endlocal

Пример:

E:\OS.ADMIN>LCASE.BAT The Quick Fox Jumps Over The Brown Fence.

Результат:

_STRING=The Quick Fox Jumps Over The Brown Fence.
_STRING=the quick fox jumps over the brown fence.

Ответ 3

загрузите некоторые утилиты Unix для DOS с http://short.stop.home.att.net/freesoft/unix.htm и используйте tr.exe (перевод символов)

echo %USERNAME% | tr "[A-Z]" "[a-z]" 

Я также использую расширенную замену cmd для DOS с именем 4NT, которая имеет встроенную команду @lower

echo %@lower[%USERNAME%]

Ответ 4

http://www.dzone.com/snippets/lowercasing-string-bat-files

lower.bat

echo>%1
dir /b/l %1>lower.tmp
set /p result=<lower.tmp
echo %result%

CMD

lower "Mein BinnenMajuskel"

результат

mein binnenmajuskel

ВНИМАНИЕ: Быстрый и грязный, но также небезопасный и опасный вариант. Потому что вы создаете два файла. Один вызывается как заданная строка, а другой называется lower.tmp, который содержит пониженную строку. Что произойдет, если вы выполните lower "UserName" в каталоге, где этот файл или каталог уже существует? Особенно, если вы удалите эти файлы потом...

Улучшенная версия:

echo>%Temp%\%1
dir /b/l %Temp%\%1>%Temp%\lower.tmp
set /p result=<%Temp%\lower.tmp
del %Temp%\%1
del %Temp%\lower.tmp

Ответ 5

Когда установлен язык сценариев, его можно использовать с "FOR" для установки переменной.

Можно использовать любой язык сценариев, если он может преобразовать строку в нижний регистр и вывести результат.

Пример использования Perl 5:

@FOR /F %%s IN ('perl -e "print lc(pop)" %USERNAME%') DO @set USERNAME=%%s

Пример использования PowerShell:

@FOR /F %%s IN ('powershell -command "(get-item env:'USERNAME').Value.ToLower()"') DO @set USERNAME=%%s

В наши дни, скорее всего, PowerShell уже установлен по умолчанию.

Ответ 6

:: UPcase.bat ==> Store in environment variable _UPcase_ the upper case of %1
:: -> Use quotes "" when the first argument has blanks or special characteres
::
:: Adapted from -> http://www.netikka.net/tsneti/info/tscmd039.htm
::
:: Note that the substitution method is case insensitive, which means that
:: while working for this application, it is not useful for all character
:: substitution tasks.
::
:: More concisely, one can capitalize (if you pardon the pun) on the fact
:: that in for and the substitution lower and upper case source are
:: equivalent.
@echo off

:: %~1 -> removes quotes from the first command line argument
:: http://steve-jansen.github.io/guides/windows-batch-scripting/part-2-variables.html
@echo off
::setlocal EnableExtensions
    :: echo %_UPcase_%
    call :ToUpcaseWithFor "%~1" _UPcase_
    :: echo %_UPcase_% _doit_1_
::endlocal & goto :EOF
goto :EOF
::
:: ======================
:ToUpcaseWithFor
setlocal EnableExtensions EnableDelayedExpansion
  set var_=%~1
  for %%c in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    set var_=!var_:%%c=%%c!
  )
endlocal & set %2=%var_%& goto :EOF

:EOF
:: UPcase.bat ==> EOF