2016-01-11 44 views
4

在使用變量之前,我該如何將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! 

對不起粗碼 - 我是很新的這一點。

問候,

約書亞

+1

[此鏈接可能?](http://www.robvanderwoude.com/battech_convertcase.php) – Bloodied

回答

10

的捷徑(無需第三方下載)將使用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()); 

或者,如果你想成爲真正hacksy的話,你可能會濫用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% 
+0

最初在[本答案](http:// stackoverflow.com/questi ons/15648560/windows-batch-file-read-text-file-and-convert-all-to-upper)是這一行:'for %% b in(ABCDEFGHIJKLMNOPQRSTU VWXYZ)do set「str =!str:% %b = %% b!「'。我沒有測試過它,但是這種純Batch方法可能和WSH一樣快,因爲加載'cscript.exe'文件的開銷很大。 – Aacini

+1

@Aacini檢查我的黑客發現。 :) – rojo

+2

我非常喜歡它! **':)'** +1它甚至可以和西班牙字符一起正常工作!嘗試:'樹'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'' – Aacini

2
@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 

的方法,提到了在Aacini失敗Windows batch file read text file and convert all to uppercase對於某些字符,如由上述批次證明。

如果有問題的字符串包含某些字符(例如%:),該批次也會失敗 - 它將轉換字母,但刪除%:

上述批次首先建立一個包含雜項字符的字符串,將其顯示並保存爲文件,然後使用:upper進行轉換。

爲了進行比較,然後使用:upcase函數(從鏈接的響應派生)進行文件處理。


繼Aacini的有效意見和進一步的調查,這裏有一些技術(包括「讀源文件」方法的演示)

:showline程序存在通過顯示line縮短代碼delayedexpansion模式

@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 
+1

您報告的問題與大寫轉換方法無關,而是與文件中的行讀取有關。試試這個:'set'line = abcdefghijklmnopqrstuvwxyz1234567890 |!#$ %%&/ \()=?<>,;。:''_- + *〜^^ [] {}「&'setlocal EnableDelayedExpansion'&' (ABCDEFGHIJKLMNOPQRSTU VWXYZ)中的%% b設置「line =!line:%% b = %% b!」'&'echo!line!'在這個例子中,所有字符都被正確轉換,甚至'%:*〜 !' – Aacini

+0

** 1。**這個問題是關於「將**變量**轉換爲大寫」,特別是「** destl **變量」,所以你所有關於「從文件讀取數據」的代碼和解釋是你應該在另一個問題上發佈這個答案,即關於「**閱讀文本文件**並且全部轉換爲大寫」。** 2。**您的編輯只是確認在給定鏈接上發佈的答案是這是一個針對這個問題的工作解決方案,所以最好保留我插入的「重複問題」標記(你爲了發佈這個答案而刪除了這個標記) – Aacini

1

這是毫無意義的,因爲的環境變量名和文件名都是不區分大小寫。但是,如果你堅持,你可以做這樣的:

@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% 
1

感謝您的答覆傢伙,我解決它使用此 -

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 

我相信你的回答是更整潔,更有效率,但是因爲我正在做的伎倆nd我不想破壞任何東西,我會保持原樣!

謝謝您的輸入!

+1

您自己找到了最好的解決方案!它甚至更加整潔:對於%a in(「a = A」「b = B」「c = C」)來設置x =!x:%〜a! – Henrik