2016-01-11 3 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! 

Sorry о грубом коде - я совсем новичок в этом.

Привет,

Джошуа

+1

[Возможно, это ссылка?] (Http://www.robvanderwoude.com/battech_convertcase.php) – Bloodied

ответ

10

Самый короткий путь (без необходимости загрузки 3-й партии) будет использовать 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-uppercase) - это одна строка: 'for %% b in (ABCDEFGHIJKLMNOPQRSTU VWXYZ) действительно устанавливает« str =! str:% % б = %% б! "'. Я не тестировал его, но возможно, что этот чистый пакетный метод будет таким же быстрым, как WSH, потому что накладные расходы на загрузку файла 'cscript.exe'. – Aacini

+1

@Aacini Посмотрите мое открытие hacksy. :) – rojo

+2

Мне это очень нравится! ** ':)' ** +1 Он даже корректно работает с испанскими символами! Попробуйте: 'tree '\ El papá y la mamá del niño güero" ' – 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' &' для %% b in (ABCDEFGHIJKLMNOPQRSTU VWXYZ) установите «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 

Я уверен, что ваши ответы намного опрятнее и эффективнее, но поскольку мой делает трюк a и я не хочу ничего сломать, я оставлю это как есть!

Благодарим вас за ввод!

+1

Вы нашли лучшее решение самостоятельно! Это даже более аккуратно: для% a in ("a = A" "b = B" "c = C") задайте x =! X:% ~ a! – Henrik

 Смежные вопросы

  • Нет связанных вопросов^_^