如何在Windows批处理脚本中将%USERNAME%的值转换为小写?

Nan*_*ada 11 windows scripting cmd batch-file

我使用点击蝙蝠脚本自动化一些源代码控制软件功能,但鉴于我们的svn repos托管在*NIX框中,我面临着这两个世界之间的永恒案例问题.

是否有任何cmd.exe函数将Windows系统变量%USERNAME%的值转换为小写?

非常感谢!

Dha*_*rdi 14

好吧,我正在浏览一些语法,偶然发现了这个页面.我知道它已经老了,但我想我会休息一下,让大脑有点小动作.

这里的东西有点短,易于管理.这只是"强制"将所有大写字母改为小写字母,而不考虑字符串中是否存在实际字母.因此,无论字符串的长度如何,功能循环都会正好运行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
Run Code Online (Sandbox Code Playgroud)

例:

E:\OS.ADMIN>LCASE.BAT The Quick Fox Jumps Over The Brown Fence.
Run Code Online (Sandbox Code Playgroud)

结果:

_STRING=The Quick Fox Jumps Over The Brown Fence.
_STRING=the quick fox jumps over the brown fence.
Run Code Online (Sandbox Code Playgroud)

  • 不知何故,某个地方的"z"和"y"属于该句子.:) :) :)也许`快速的棕色狐狸跳过一只懒狗.:) :) :) (5认同)

Mau*_*uro 8

一个快速的谷歌发现 ...

@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 
Run Code Online (Sandbox Code Playgroud)

将它作为文件(lowercase.cmd)添加到您的路径中,您应该能够将其称为"Lowercase.cmd%Username%",如果需要,您可以将其管道到另一个命令中.


小智 7

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

下.bat

echo>%1
dir /b/l %1>lower.tmp
set /p result=<lower.tmp
echo %result%
Run Code Online (Sandbox Code Playgroud)

指令

lower "Mein BinnenMajuskel"
Run Code Online (Sandbox Code Playgroud)

结果

mein binnenmajuskel
Run Code Online (Sandbox Code Playgroud)

注意:快速和肮脏,但也不安全和危险的变体。因为你创建了两个文件。一个像给定的字符串一样调用,另一个称为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
Run Code Online (Sandbox Code Playgroud)


npo*_*aka 7

这可能是在批处理文件中将字符串转换为小写的最快方法,因为它使用并且没有临时文件(它将生成的字符串保存在名为 的变量中result):

@echo off

set LowerCaseMacro=for /L %%n in (1 1 2) do if %%n==2 (for %%# 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 "result=!result:%%#=%%#!") else setlocal enableDelayedExpansion ^& set result=

set "string=SOme STrinG WiTH lowerCAse letterS and UPCase leTTErs"
%LowerCaseMacro%%string%

echo %result%
Run Code Online (Sandbox Code Playgroud)


小智 5

http://short.stop.home.att.net/freesoft/unix.htm下载一些用于DOS的unix实用程序, 并使用tr.exe(翻译字符)

echo %USERNAME% | tr "[A-Z]" "[a-z]" 
Run Code Online (Sandbox Code Playgroud)

我还使用名为4NT的DOS扩展cmd替换,该替换具有内置命令@lower

echo %@lower[%USERNAME%]
Run Code Online (Sandbox Code Playgroud)


Luk*_*rms 5

安装脚本语言后,可以将其与 aFOR一起使用以设置变量。

@FOR /F %%s IN ('<<some script oneliner>>') DO @set MYVARIABLE=%%s
Run Code Online (Sandbox Code Playgroud)

如果可以将字符串转换为小写并输出结果,则可以使用任何脚本语言。

使用 Perl 5 的示例:

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

使用 PowerShell 的示例:

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

如今,PowerShell 可能已经默认安装。


小智 5

在我的批处理文件中,我正在对 %USERNAME% 和 CSV 文件进行比较。

如果用户使用大写用户名登录,该程序将无法运行。

例如:
登录:GB2NOGU // 不起作用
登录:gb2nogu // 有效

在这里我可以通过不敏感的比较来解决我的问题。

if /i %USERNAME%==gb2nogu (
     // Code here
)
Run Code Online (Sandbox Code Playgroud)

参数 /i 告诉 cmd 进行不区分大小写的比较,因此它将忽略小写字母和大写字母之间的差异。