我正在使用点 bat 脚本自动化一些源代码控制软件功能,但鉴于我们的 svn 存储库托管在 *NIX 盒子中,我面临着这两个世界之间的永恒案例问题。
是否有任何 cmd.exe 函数可以将 Windows 系统变量 %USERNAME% 的值转换为小写?
提前非常感谢!
我正在使用点 bat 脚本自动化一些源代码控制软件功能,但鉴于我们的 svn 存储库托管在 *NIX 盒子中,我面临着这两个世界之间的永恒案例问题。
是否有任何 cmd.exe 函数可以将 Windows 系统变量 %USERNAME% 的值转换为小写?
提前非常感谢!
好吧,我正在浏览一些语法并偶然发现了这个页面。我知道它很旧,但我想我会休息一下,给大脑一点刺激。
这里有一些更短且易于管理的东西。这只是将所有大写字母“强制”为小写字母,而不考虑实际字母是否存在于字符串中。因此,无论字符串的长度如何,功能循环都会运行 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.
一个快速的谷歌发现了这个......
@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%”,如果需要,您可以将其通过管道传输到另一个命令中。
从http://short.stop.home.att.net/freesoft/unix.htm下载一些用于 DOS 的 unix 实用程序 并使用 tr.exe(翻译字符)
echo %USERNAME% | tr "[A-Z]" "[a-z]"
我还使用了一个名为 4NT 的 DOS 扩展 cmd 替换,它有一个内置命令 @lower
echo %@lower[%USERNAME%]
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%
命令
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
安装脚本语言后,可以将其与 a 一起使用FOR
来设置变量。
@FOR /F %%s IN ('<<some script oneliner>>') DO @set MYVARIABLE=%%s
如果可以将字符串转换为小写并输出结果,则可以使用任何脚本语言。
使用 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。
在我的批处理文件中,我正在比较 %USERNAME% 和 CSV 文件。
如果用户以大写用户名登录,该程序将无法运行。
例如:
登录:GB2NOGU // 不起作用
登录:gb2nogu //起作用
在这里,我可以通过不敏感的比较来解决我的问题。
if /i %USERNAME%==gb2nogu (
// Code here
)
参数 /i 告诉 cmd 进行不区分大小写的比较,因此它会忽略小写字母和大写字母之间的区别。
可能这是在批处理文件中将字符串转换为小写的最快方法,因为它使用宏并且没有临时文件(它将生成的字符串保存在名为 的变量中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%
:: 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
这是相同的答案/ @It Wasn't Me here
对于预测字符集,此子字符串Set !var:A=a!
有效,并且仅适用于bat / cmd中的预定义子字符串。
对于这种类型的任务,为什么不使用c#获得一点帮助,它可以使用非常规的重音和辅音è、È、ä、Ä、ñ、Ñ、ç、Ç 等。
其中bat / cmd会生成c#代码的地方,会在运行时编译执行....
这解决了可能的用户输入,其中序列带有重音并且元音/辅音不同于传统的[az]和/或[A_Z]
@echo off & setlocal EnableDelayedExpansion
cd /d "%~dp0" && title <nul && title ...\%~dpnx0 /// !time:~0,8! !date!
if exist "%tmp%\ToUpLower.cs" 2>nul >nul del /q /f "%tmp%\ToUpLower.cs"
set "_where=%__appdir__%where.exe" && set "_csc=%windir%\Microsoft.NET"
>"%temp%\ToUpLower.cs" (
echo= using System; namespace SUQ1522019 ^{class Program ^{static void Main(string[] args^) ^{
echo= if (args.Length==2 ^&^& args[0].ToLower(^)=="-l"^) ^{Console.WriteLine(args[1].ToLower(^)^);^}
echo= if (args.Length==2 ^&^& args[0].ToLower(^)=="-u"^) ^{Console.WriteLine(args[1].ToUpper(^)^);^}^}^}^}
)
set "_arg=/t:exe /out:"%tmp%\ToUpLower.exe" "%tmp%\ToUpLower.cs" /platform:anycpu "
for /f tokens^=* %%i in ('!_where! /r "!_csc!" "csc.exe"^|findstr /lic:"k\v2\."
')do "%%~i" !_arg! /unsafe+ /w:0 /o /nologo
for /f tokens^=* %%U in ('"%tmp%\ToUpLower.exe" -u %USERNAME%')do set "_up_case=%%U"
for /f tokens^=* %%l in ('"%tmp%\ToUpLower.exe" -l %USERNAME%')do set "_low_case=%%l"
echo/ Your username upcase is: !_up_case!
echo/ Your username lowcase is: !_low_case!
echo/ >nul 2>nul copy "%tmp%\ToUpLower.exe" "."
del /q /f "%tmp%\ToUpLower.*" >nul 2>nul && endlocal & goto :EOF
%USERNAME%
Your username upcase is: USERNAME
Your username lowcase is: username
没有转义的c#代码:ToUpLower.cs
using System; namespace SUQ1522019 {class Program {static void Main(string[] args) {
if (args.Length==2 && args[0].ToLower()=="-l") {Console.WriteLine(args[1].ToLower());}
if (args.Length==2 && args[0].ToLower()=="-u") {Console.WriteLine(args[1].ToUpper());}}}}
没有转义和缩进的c#代码:ToUpLower.cs
using System
namespace SUQ1522019
{
class Program
{
static void Main(string[] args)
{
if (args.Length==2 && args[0].ToLower()=="-l")
{
Console.WriteLine(args[1].ToLower());
}
if (args.Length==2 && args[0].ToLower()=="-u")
{
Console.WriteLine(args[1].ToUpper());
}
}
}
}
csc.exe
c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe
c:\Windows\Microsoft.NET\Framework\v3.5\csc.exe
c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
c:\Windows\Microsoft.NET\Framework64\v2.0.50727\csc.exe
c:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:exe /out:"%tmp%\ToUpLower.exe" "%tmp%\ToUpLower.cs" /platform:anycpu /unsafe+ /w:0 /o /nologo
ToUpLower.exe
使用 UPPER 到 -> 降低
ToUpLower.exe -l STRING
:: or ..
ToUpLower.exe -L STRING
ToUpLower.exe
用法 低于 -> UPPER
ToUpLower.exe -u string
:: or ..
ToUpLower.exe -U string
要保留ToUpLower.exe
,请echo/
从命令中删除:copy
echo/>nul 2>nul 复制 "%tmp%\ToUpLower.exe" "."
此命令行将从您的 bat 运行的同一个文件夹复制ToUpLower.exe
到%temp%
同一个文件夹。
编程指南 C#:
对不起我有限的英语