24

我正在使用点 bat 脚本自动化一些源代码控制软件功能,但鉴于我们的 svn 存储库托管在 *NIX 盒子中,我面临着这两个世界之间的永恒案例问题。

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

提前非常感谢!

4

9 回答 9

17

好吧,我正在浏览一些语法并偶然发现了这个页面。我知道它很旧,但我想我会休息一下,给大脑一点刺激。

这里有一些更短且易于管理的东西。这只是将所有大写字母“强制”为小写字母,而不考虑实际字母是否存在于字符串中。因此,无论字符串的长度如何,功能循环都会运行 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.
于 2014-05-22T12:13:27.930 回答
10

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

@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%”,如果需要,您可以将其通过管道传输到另一个命令中。

于 2008-11-12T18:22:18.687 回答
7

从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%]
于 2008-11-12T21:10:53.573 回答
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%

命令

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
于 2015-03-18T09:50:19.133 回答
5

安装脚本语言后,可以将其与 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。

于 2015-12-04T10:02:33.017 回答
4

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

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

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

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

if /i %USERNAME%==gb2nogu (
     // Code here
)

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

于 2019-08-02T13:20:42.637 回答
3

可能这是在批处理文件中将字符串转换为小写的最快方法,因为它使用并且没有临时文件(它将生成的字符串保存在名为 的变量中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%
于 2020-05-26T17:48:17.550 回答
2
:: 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
于 2014-10-03T16:13:47.690 回答
0

这是相同的答案/ @It Wasn't Me here


对于预测字符集,此子字符串Set !var:A=a!有效,并且仅适用于 / 中的预定义子字符串

获得一点帮助,它可以使用非常规的重音和辅音è、È、ä、Ä、ñ、Ñ、ç、Ç 等。

其中 / 会生成代码的地方,会在运行时编译执行....

这解决了可能的用户输入,其中序列带有重音并且元音/辅音不同于传统的[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

没有转义的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());}}}}

没有转义和缩进的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#:


对不起我有限的英语

于 2020-02-04T18:43:31.997 回答