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
응답하십시오. 어딘가 구문 오류가 있어야합니다. 대상 배치 파일이 올바르게 작동합니다. 이 시간. 하지만 중첩 된 IF 문을 중첩 시키려고하지 않았으므로이 문제를 갱신 할 수 있습니다. –
절대로 실패하지 않습니다. 내가 공공 장소에서 자신을 부끄럽게 할 때까지 내 자신의 실수를 발견 할 수 없다. 변수 주위에 따옴표가 필요했습니다. 아무도 비슷한 문제가없는 이유를 궁금해했습니다. 이제 알았어! –