web-dev-qa-db-ja.com

Windowsバッチスクリプト内で%USERNAME%の値を小文字に変換するにはどうすればよいですか?

ドットバットスクリプトを使用して一部のソース管理ソフトウェア機能を自動化していますが、svnリポジトリが* NIXボックスでホストされていることを考えると、これら2つの世界の間で永遠のケースの問題に直面しています。

Windowsシステム変数%USERNAME%の値を小文字に変換するcmd.exe関数はありますか?

よろしくお願いします!

13
Nano Taboada

クイックグーグルが見つかりました 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%」として呼び出すことができるはずです。必要に応じて、別のコマンドにパイプすることができます。

8
Mauro

さて、私はいくつかの構文を探していて、このページに出くわしました。私はその古いことを知っていますが、私は休憩して脳に少しキックを与えると思いました。

これは少し短くて扱いやすいものです。これは、実際の文字が文字列に存在するかどうかに関係なく、すべての大文字を小文字に「ブルートフォース」するだけです。したがって、関数ループは、文字列の長さに関係なく、正確に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.
14
Dharma Leonardi

http://short.stop.home.att.net/freesoft/unix.htm からDOS用のいくつかのUNIXユーティリティをダウンロードし、tr.exeを使用します(文字を翻訳します)

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

また、コマンド@lowerが組み込まれている4NTという名前のDOS拡張cmd置換を使用します

echo %@lower[%USERNAME%]
5
SumoRunner

バッチファイルで、%USERNAME%とCSVファイルを比較しています。

ユーザーがUperCaseユーザー名でログインしている場合、プログラムは機能しません。

例:
ログイン:GB2NOGU //機能しません
ログイン:gb2nogu //動作します

ここで、鈍感な比較を行うことで問題を解決できます。

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

パラメータ/ iは、大文字と小文字を区別しない比較を行うようにcmdに指示するため、小文字と大文字の違いは無視されます。

スクリプト言語がインストールされている場合、それを「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がデフォルトですでにインストールされている可能性があります。

3
LukStorms

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

注意:迅速で汚れていますが、安全ではなく危険なバリアントでもあります。 2つのファイルを作成するためです。 1つは指定された文字列のように呼び出され、もう1つは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
3
StackFi Neon
:: 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
1
Adolfo

これは同じ答えです/ by @It Was n't Mehere


予測文字セットの場合、この部分文字列Set !var:A=a!は機能し、事前定義された部分文字列in bat / cmdでのみ機能します。

このタイプのタスクでは、c#を少し助けてみませんか。これにより、型にはまらないアクセントや子音を操作できるようになりますè、È、ä、Ä、ñ、Ñ 、ç、Çなど

bat / cmdc#コードを生成する場合、実行時にコンパイルおよび実行されます..。

これは、シーケンスにアクセントが付いており、母音/子音が従来のものとは異なる、考えられるユーザー入力を解決します[a-z]および/または[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.csc#エスケープなしのコード:


 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.csc#エスケープおよびインデントされていないコード:


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#コードはコンパイル/テスト済み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#コード:
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使用法上から->下
ToUpLower.exe -l STRING 

:: or ..

ToUpLower.exe -L STRING

  • ToUpLower.exe使用法下から->上

ToUpLower.exe -u string

:: or ..

ToUpLower.exe -U string

ToUpLower.exeを維持するには、echo/copycommand


エコー/ > nul 2> nul copy "%tmp%\ ToUpLower.exe" "。" 

このコマンドラインは、ToUpLower.exe%temp%からバットが実行されているのと同じフォルダーにコピーします。


プログラミングガイドC#:


申し訳ありませんが私の限られた英語

0
It Wasn't Me