2016-11-01 6 views
0

IFs % 1 인 Windows CMD 파일이 있습니다. 그러나 % 1에 괄호가 포함되어 있으면 배치 파일은 괄호를 명령을 열거 나 닫는 것으로 해석합니다.% 1 매개 변수에 괄호 또는 괄호가 포함되어 있으면 CMD 파일에 오류가 발생합니다.

예를 들어 "File Copy (3) .txt"와 같은 매개 변수를 IF 또는 FOR로 안전하게 저장하려면 어떻게해야합니까?

어떤 일이 일어나고 있는지 파악하는 데 영원히 걸렸습니다. 왜 때로는 문제가 없었고 때로는 그냥 놀랐습니다. 나는 이것을 조금 더 살피고, 성공이나 실패를 가정하고 오류를 점검하고, 머리카락을 제거하는 동안 제거한 콜을 복원해야합니다. 그것이 도움이된다면, 나는 가지고있는 것을 복사하고 있습니다.

"% ~ 1"은 (는) 벙어 (dumb)입니다. 나는 따옴표를 벗기고 그것을 다시 그것들에 넣고있다. 그건 도움이 안된다.

CMD 파일 상단에 SETLOCAL EnableDelayedExpansion을 포함해도 도움이되지 않습니다.

IF가 어떻게 작동하는지 이해할 수 없습니까?

코드는 다음과 같습니다

@cls     & REM blank gratuitous error message when run from server 
@echo off 
SETLOCAL EnableExtensions 

::----------------------------------------------------------------------------- 
:: ONLY THE NEXT TWO LINES MAY BE CUSTOMIZED BY THE USER 
set _CAT=DigitalCAT 
set _User=Timothy McGowan 
::----------------------------------------------------------------------------- 

::----------------------------------------------------------------------------- 
:: Set up two more variables 
set _Server=\\[path blanked; nonpublic server] 
set _Path=%_Server%\%_CAT%\%_User% 
::----------------------------------------------------------------------------- 

::----------------------------------------------------------------------------- 
::----------              top of loop 
:Loop 
::---------- 
If "%~1"=="" (goto Done) 

:: Get chunks of name from first parameter on command line. 
:: _fnam is just file name without path or quotes. 
:: _tnam is just file name without path, quotes, or extension. 
:: _yr is first four characters of file name, which is supposed to be a year. 
:: _mo holds the 6th and 7th characters of the file name and should be 
::  among the numbers 01 through 12. 
:: Better error checking would determine whether a space or mark of punctuation 
::  separates the first four characters. A file name such as 
::  20160126... could get filed in December rather than January. 
::  So IF the fifth character is a digit, use that and next; else, 
::  use sixth and seventh. 
    set _fnam=%~nx1 
    set _yr=%_fnam:~0,4% 
    set _mox=%_fnam:~5,2% 
    if %_mox%==01 (set _mo=01 - January) & goto MonthSet 
    if %_mox%==02 (set _mo=02 - February) & goto MonthSet 
    if %_mox%==03 (set _mo=03 - March)  & goto MonthSet 
    if %_mox%==04 (set _mo=04 - April)  & goto MonthSet 
    if %_mox%==05 (set _mo=05 - May)  & goto MonthSet 
    if %_mox%==06 (set _mo=06 - June)  & goto MonthSet 
    if %_mox%==07 (set _mo=07 - July)  & goto MonthSet 
    if %_mox%==08 (set _mo=08 - August) & goto MonthSet 
    if %_mox%==09 (set _mo=09 - September) & goto MonthSet 
    if %_mox%==10 (set _mo=10 - October) & goto MonthSet 
    if %_mox%==11 (set _mo=11 - November) & goto MonthSet 
    if %_mox%==12 (set _mo=12 - December) & goto MonthSet 
    Goto BadMonth 

::---------- 
:MonthSet   & REM Skip "Goto Badmonth" command, the catchall rerouter. 
::---------- 
:: Find out whether first four digits of file name are a year, 
:: and whether that year is a folder's name within user's folder. 
:: If not, create folder in NewYear procedure. 

    if NOT exist "%_Path%\%_yr%\" (
     echo. 
     echo %_yr% is not yet a folder in your storage space. 
     echo Is this a new year, or did you typo the year in the file name? 
     echo The file's name needs to be in [year-month-day Judge] format. 
     echo For instance, "2016-10-22 Perkkio" works, but "20161022 Perkkio" does not. 
     echo Your file is named %_fnam%. 
     echo. 
     echo Either... 
     echo Press A to Add %_yr% 
     echo or... 
     echo Press C to Cancel so you can rename the file. 
     choice /N /C CA 
     if errorlevel 2 (
     MD "%_Path%\%_yr%" 
     echo %date% %time%: Created %_yr% folder>>"%_Path%\%_yr%\Log.txt" 
     goto YearAdded 
    ) 
     if errorlevel 1 (
     set _errFlag=1 
     echo.>>"%_Path%\ErrorMessages.txt" 
     echo %date% %time%: ERROR! FOLLOWING FILE NOT COPIED:>>"%_Path%\ErrorMessages.txt" 
     echo %_fnam%>>"%_Path%\ErrorMessages.txt" 
     goto End 
    ) 
    ) 

::---------- 
:YearAdded 
::---------- 
:: Folder Year should now exist on server. 
:: If necessary, quietly create new Month folder in Year folder. 
    if NOT exist "%_Path%\%_yr%\%_mo%" (
     MD "%_Path%\%_yr%\%_mo%" 
     echo %date% %time%: Created %_yr%\%_mo% folder>>"%_Path%\%_yr%\Log.txt" 

    ) 

::---------- 
:: If file already uploaded, handle; else, just copy. 
    if exist "%_Path%\%_yr%\%_mo%\%_fnam%" (
     echo. 
     echo %_Path%\%_yr%\%_mo%\%_fnam% aleady exists. 
     echo. 
     echo You may... 
     echo Press R to replace the copy you already uploaded, 
     echo. 
     echo Press S to skip this file, 
     echo Or... 
     echo Press Q to quit. 
     choice /N /C QSR 
     if errorlevel 3 (
      copy /y "%~1" "%_Path%\%_yr%\%_mo%" 
      echo %date% %time%: %_fnam% replaced in %_yr%\%_mo%>>"%_Path%\%_yr%\Log.txt" 
      SHIFT 
      GOTO LOOP 
     ) 
     if errorlevel 2 (
      echo %date% %time%: %_fnam% not replaced in %_yr%\%_mo%>>"%_Path%\%_yr%\Log.txt" 
      SHIFT 
      GOTO LOOP 
     ) 
     if errorlevel 1 (
      set _errFlag=1 
      echo.>>"%_Path%\ErrorMessages.txt" 
      echo %date% %time%: ERROR! FOLLOWING FILE NOT COPIED:>>"%_Path%\ErrorMessages.txt" 
      echo %_fnam%>>"%_Path%\ErrorMessages.txt" 
      goto End 
     ) 

    ) ELSE (
     copy "%~1" "%_Path%\%_yr%\%_mo%" 
     echo %date% %time%: %_fnam% copied to %_yr%\%_mo%>>"%_Path%\%_yr%\Log.txt" 
     SHIFT 
     GOTO LOOP 
    ) 

::                bottom of loop 
::----------------------------------------------------------------------------- 


::----------------------------------------------------------------------------- 
::---------- 
:BadMonth 
::---------- 
    echo. 
    echo ERROR! 
    echo "%_mox%" is not a valid month. 
    echo The file's name needs to be in [year-month-day Judge] format. 
    echo For instance, "2016-10-22 Perkkio" works, but "20161022 Perkkio" does not. 
    echo. 
    echo Your file is named: 
    echo %_fnam% 
    echo. 
    echo Please rename the file and use this utility again. 
goto VeryEnd 
::----------------------------------------------------------------------------- 


::----------------------------------------------------------------------------- 
::---------- 
:Done 
::---------- 
    echo. 
    echo No more files found to copy. 
goto End 
::----------------------------------------------------------------------------- 


::----------------------------------------------------------------------------- 
::----------        Allow user to read results on screen. 
:End 
::---------- 
if .%_errFlag%.==.1. (
    type "%_Path%\ErrorMessages.txt" 
    echo. 
    echo NOTE FILES NOT COPIED ABOVE. 
) 
echo. 
pause 

::---------- 
:VeryEnd 
::---------- 
:: cls 
+0

응답하십시오. 어딘가 구문 오류가 있어야합니다. 대상 배치 파일이 올바르게 작동합니다. 이 시간. 하지만 중첩 된 IF 문을 중첩 시키려고하지 않았으므로이 문제를 갱신 할 수 있습니다. –

+0

절대로 실패하지 않습니다. 내가 공공 장소에서 자신을 부끄럽게 할 때까지 내 자신의 실수를 발견 할 수 없다. 변수 주위에 따옴표가 필요했습니다. 아무도 비슷한 문제가없는 이유를 궁금해했습니다. 이제 알았어! –

답변

0

은 절대로 실패하지 않습니다. 내가 공공 장소에서 자신을 부끄럽게 할 때까지 내 자신의 실수를 발견 할 수 없다. _fnam 변수 주위에 따옴표가 필요했습니다. 왜 다른 누구도 괄호로 비슷한 문제가 없었는지 궁금해. 이제 알았어!

코드를 정리하고 일부 잘라 내기 및 붙여 넣기 잔여 물을 고정했으며 의도 한대로 작동합니다. 레이블에 대한 내부 호출로 다시 작성하는 것이 좋겠지 만,이 시점에서 나는 충분히 혼자 남을 것이라고 생각합니다.