web-dev-qa-db-ja.com

バッチ-変数を大文字に変換

destl変数を使用する前に大文字に変更するにはどうすればよいですか?私はある種のキャラクターの入れ替えを想定していますが、機能させることができませんでした。コードは次のとおりです-

@echo off
echo.

set /P "destf=Enter First Name: "

set /P "destl=Enter Last Name: "

set "findest=Z:\ProjectIT\copy\%destl%, %destf%"

robocopy Z:\ProjectIT\copy\test "%findest%" /e /NFL /NDL /NJH /NJS

robocopy Z:\ProjectIT\copy\Construction "%findest%"\1-BLANK-%destl% /e /NFL /NDL /NJH /NJS"

echo Construction folder has been created for "%destl%"
echo.

pause

私は次のようなものを呼び出そうとしましたが、それを機能させることができませんでした-

:Uppercase
set %~1=!%1:a=A!
set %~1=!%1:b=B!
set %~1=!%1:c=C!
set %~1=!%1:d=D!
set %~1=!%1:e=E!
set %~1=!%1:f=F!
set %~1=!%1:g=G!
set %~1=!%1:h=H!
set %~1=!%1:i=I!
set %~1=!%1:j=J!
set %~1=!%1:k=K!
set %~1=!%1:l=L!
set %~1=!%1:m=M!
set %~1=!%1:n=N!
set %~1=!%1:o=O!
set %~1=!%1:p=P!
set %~1=!%1:q=Q!
set %~1=!%1:r=R!
set %~1=!%1:s=S!
set %~1=!%1:t=T!
set %~1=!%1:u=U!
set %~1=!%1:v=V!
set %~1=!%1:w=W!
set %~1=!%1:x=X!
set %~1=!%1:y=Y!
set %~1=!%1:z=Z!

大まかなコードについては申し訳ありません-私はこれにかなり慣れていません。

よろしく、

ジョシュア

7

最短の方法(サードパーティのダウンロードを必要としない)は、PowerShellを使用することです。

set "str=The quick brown fox"
for /f "usebackq delims=" %%I in (`powershell "\"%str%\".toUpper()"`) do set "upper=%%~I"

より高速な方法ですが、純粋なバッチソリューションよりも使用するコードが少ない場合は、WSHを使用することになります。

@if (@CodeSection == @Batch) @then
@echo off & setlocal

set "str=The quick brown fox"
for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%str%"') do set "upper=%%~I"
set upper
goto :EOF

@end // end Batch / begin JScript hybrid
WSH.Echo(WSH.Arguments(0).toUpperCase());

そしてもちろん、どちらの関数も簡単に作成できるため、必要に応じて複数回callできます。

@if (@CodeSection == @Batch) @then
@echo off & setlocal

call :toUpper upper1 "The quick brown fox"
call :toUpper upper2 "jumps over the lazy dog."
set upper
goto :EOF

:toUpper <return_var> <str>
for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%~2"') do set "%~1=%%~I"
goto :EOF

@end // end Batch / begin JScript hybrid
WSH.Echo(WSH.Arguments(0).toUpperCase());

または、本当にハックしたい場合は、treeコマンドのエラーメッセージを次のように悪用することができます。

@echo off & setlocal

set upper=
set "str=Make me all uppercase!"
for /f "skip=2 delims=" %%I in ('tree "\%str%"') do if not defined upper set "upper=%%~I"
set "upper=%upper:~3%"
echo %upper%
18
rojo

回答の人たちに感謝し、私はこれを使ってそれを解決しました-

if not defined %~1 EXIT /b
for %%a in ("a=A" "b=B" "c=C" "d=D" "e=E" "f=F" "g=G" "h=H" "i=I"
        "j=J" "k=K" "l=L" "m=M" "n=N" "o=O" "p=P" "q=Q" "r=R"
        "s=S" "t=T" "u=U" "v=V" "w=W" "x=X" "y=Y" "z=Z" "ä=Ä"
        "ö=Ö" "ü=Ü") do (
call set %~1=%%%~1:%%~a%%
)
EXIT /b

あなたの反応ははるかにすっきりとして効率的だと思いますが、私がうまくやっていて、何も壊したくないので、そのままにしておきます!

ご入力ありがとうございます!

11
@ECHO Off
SETLOCAL
SET "betabet=abcdefghijklmnopqrstuvwxyz1234567890!*$^&^^+=-\^|^>;'.,/?^<"
ECHO %betabet%
>u:\betabet.file ECHO %betabet%
CALL :upper betabet
ECHO %betabet%
CALL :upcase u:\betabet.file 
GOTO :EOF

:upper
FOR %%a 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 CALL SET "%1=%%%1:%%a=%%a%%%"
GOTO :EOF

:upcase
setlocal EnableDelayedExpansion
for /F "delims=" %%a in (%1) do (
   set "line=%%a"
   for %%b 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 "line=!line:%%b=%%b!"
   )
   echo !line!
)
endlocal
GOTO :eof

上記のバッチで示されているように、 Windowsバッチファイルがテキストファイルを読み取り、すべて大文字に変換する でAaciniが参照する方法は、一部の文字で失敗します。

このバッチは、問題の文字列に特定の文字(%:など)が含まれている場合も失敗します。アルファベットは変換されますが、%:は削除されます。

上記のバッチは、最初にその他の文字を含む文字列を確立して表示し、ファイルとして保存してから、:upperを使用して変換します。

比較のために、ファイルは:upcase関数(リンクされた応答から派生)を使用して処理されます。


Aaciniの有効なコメントとさらなる調査に続いて、ここにいくつかの手法があります(「read-from-file」メソッドのデモを含む)。

:showlineルーチンは、linedelayedexpansionモードで表示することによりコードを短縮するために存在します

@ECHO Off
SETLOCAL
set "line=abcdefghijklmnopqrstuvwxyz1234567890|!#$%%&/\()=?<>,;.:"'_-+*~^^[]{}"
SETLOCAL enabledelayedexpansion
>u:\betabet.file ECHO "!line!"
endlocal
CALL :showline
ECHO --- show conversion using "upper - caret disappears
CALL :upper line
CALL :showline
ECHO ------------------------------
ECHO --- show actual file contents ^& data read from file
type u:\betabet.file 
CALL :upcase u:\betabet.file 
ECHO ------------------------------
set "line=abcdefghijklmnopqrstuvwxyz1234567890|!#$%%&/\()=?<>,;.:"'_-+*~^^[]{}"
CALL :showline
ECHO --- show conversion using "inline-conversion - caret PRESERVED
setlocal ENABLEDELAYEDEXPANSION
for %%b 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 "line=!line:%%b=%%b!"
echo "!line!"   ^<--- in inline conversion
endlocal&SET "line=%line:^=^^%"
CALL :showline
ECHO ------------------------------
set "line=abcdefghijklmnopqrstuvwxyz1234567890|!#$%%&/\()=?<>,;.:"'_-+*~^^[]{}"
CALL :showline
ECHO --- show conversion using "upcase2 - caret disappears
CALL :upcase2 line
CALL :showline
GOTO :EOF

:upper
FOR %%a 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 CALL SET "%1=%%%1:%%a=%%a%%%"
GOTO :EOF

:upcase
setlocal EnableDelayedExpansion
for /F "delims=" %%a in (%1) do (
 ECHO read%%a
   set "line=%%a"
   for %%b 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 "line=!line:%%b=%%b!"
   )
   echo conv!line!
)
endlocal
GOTO :eof

:upcase2
setlocal ENABLEDELAYEDEXPANSION
for %%b 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 "%1=!%1:%%b=%%b!"
endlocal&CALL SET "%1=%%%1%%"
GOTO :eof

:showline
SETLOCAL enabledelayedexpansion
ECHO "!line!"
endlocal
GOTO :eof
2
Magoo

環境変数名とファイル名はどちらも大文字と小文字を区別しないため、これは無意味です。しかし、あなたが主張するならば、あなたはこのようにすることができます:

@echo off

setlocal enabledelayedexpansion
set lower=john smith 123
set alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZ
set i=0
:letter
set !alpha:~%i%,1!_=!alpha:~%i%,1!
set /a i += 1
if %i% LSS 26 goto letter
set i=0
set upper=
:uppercase
set let=!lower:~%i%,1!
if "%let%" == "" goto done
if defined %let%_ (set upper=%upper%!%let%_!) else (set upper=%upper%%let%)
set /a i += 1
goto uppercase
:done
echo %upper%
2
Henrik

私は素晴らしい OPによる回答 を拡張して、バッチファイル全体で呼び出すことができる関数にしました。

@echo off

set "str=Make meeeee all uppercaseeeee!"
echo %str% (Old variable)
call :TOUPPERCASE str
echo %str%
goto :eof

rem FUNCTIONS AT VERY BOTTOM
:TOUPPERCASE
if not defined %~1 exit /b
for %%a in ("a=A" "b=B" "c=C" "d=D" "e=E" "f=F" "g=G" "h=H" "i=I" "j=J" "k=K" "l=L" "m=M" "n=N" "o=O" "p=P" "q=Q" "r=R" "s=S" "t=T" "u=U" "v=V" "w=W" "x=X" "y=Y" "z=Z" "ä=Ä" "ö=Ö" "ü=Ü") do (
call set %~1=%%%~1:%%~a%%
)
goto :eof

結果

Make meeeee all uppercaseeeee! (Old variable)
MAKE MEEEEE ALL UPPERCASEEEEE!
0
Ste

私は2つのファイルを使用し、バッチでは外部jsを呼び出し、バットでは内部varに応答を割り当てました。

コウモリ:

@echo off
for /f %%i in ('cscript //nologo //E:jscript jsfile.js %1') do set VAR=%%i
echo %Var%

Js(同じディレクトリにあるjsfile.js):

WScript.echo(WSH.Arguments(0).toUpperCase())
0
cbeltrangomez

多くの開発者のように、POSIXユーティリティがWindowsにインストールされている場合(例: https://sourceforge.net/projects/gnuwin32/ のGNUWinユーティリティ)

次のようなtr.exeユーティリティを使用できます:[:upper:]

@echo off
SETLOCAL EnableDelayedExpansion
echo Before: SCEINST is: %SCEINST%
set upper=
for /f "usebackq delims=" %%g in (`echo %SCEINST% ^| tr [:lower:] [:upper:]`) do (
    SET upper=%%g
    :: get rid of any leading whitespace
    set upper=!upper: =!
    goto :done
)
:done
echo After: SCEINST (in upper) is now: !upper!

- - - - - 出力 - - - - -

Before: SCEINST is: scprd
After: SCEINST (in upper) is now: SCPRD
0
Darrin