latin
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код: @rem vim: ff=dos fenc=cp866 ft=dosbatch rem @echo off :main set "strTstPth=c:\di<|:r\" rem set "strTstPth=c:\directory\dir\file.ext call :ChkFQPN "%strTstPth%" if ERRORLEVEL 0 echo OK&goto :EOF echo "Invalid characters in the name of a file or directory" goto :EOF :ChkFQPN if ""=="%~1" (exit /b -1) setlocal set "strDskName=%~d1" set "strPthName=%~p1" set "strFilName=%~n1" set "strExtName=%~x1" call :ChkDskName "%strDskName%" if not ERRORLEVEL 0 (endlocal&exit /b -1) call :ChkPthName "%strPthName%" if not ERRORLEVEL 0 (endlocal&exit /b -1) call :ChkFilDirName "%strFilName%" if not ERRORLEVEL 0 (endlocal&exit /b -1) endlocal exit /b 0 rem Процедура отправки на проверку наименований диска. :ChkDskName rem Выполняется проверка наличия входных данных. if ""=="%~1" (exit /b -1) setlocal rem Объявляются и инициализируются переменные, использующиеся в данной процедуре. set "strDskName=%~1" rem Так как допустимым считается название заканчивающееся символом двоеточие rem (:), то в первую очередь проверяем наличие данного символа в наименовании. if not ":"=="%strDskName:~-1%" (endlocal&exit /b -1) rem В случае успешного выполнения первого условия, передаём наименование для rem последующей проверки на наличие запрещённых названий и символов. rem Предварительно убрав из названия завершающий символ двоеточия, т. к. такой rem символ допускается только один раз. set "strDskName=%strDskName:~,-1%" call :ChkInvalidName "%strDskName%" if not ERRORLEVEL 0 (endlocal&exit /b -1) call :ChkInvalidChr "%strDskName%" if not ERRORLEVEL 0 (endlocal&exit /b -1) endlocal exit /b 0 rem Процедура оправки на проверку наименований маршрута к файлу. :ChkPthName rem Выполняется проверка наличия входных данных. if ""=="%~1" (exit /b -1) setlocal EnableExtensions rem Объявляются и инициализируются переменные, использующиеся в данной процедуре. set "strPthName=%~1" set "strPartPthName=" rem Выполняется разбивка полного маршрута на отдельные наименования каталогов. :SplitPth2Part for /f "delims=^\ tokens=1*" %%P in ("%strPthName%") do ( set "strPartPthName=%%P"&set "strPthName=%%Q") rem Отправка каждой наименования каталога на проверку на наличие недопустимых rem названий и символов. Т. к. разбивка идёт по символу обратная наклонная rem черта, то маршрут вида, допустим, c:\win\dows\ фактически является rem допустимым. Правда при этом проверка на наличие в наименовании символа rem обратной наклонной черты уже будет бесполезна, но это, увы, цена rem универсальности. Поэтому необходимо выполнять проверку на фактическое rem наличие данного каталога. call :ChkInvalidName "%strPartPthName%" if not ERRORLEVEL 0 (endlocal&exit /b -1) call :ChkInvalidChr "%strPartPthName%" if not ERRORLEVEL 0 (endlocal&exit /b -1) rem Если не обнаружено недопустимых наименований или символов, то получаем rem следующую часть маршрута и также отправляем её на проверку. if defined strPthName (goto SplitPth2Part) endlocal exit /b 0 rem rem Процедура отправки на проверку наименований файла или отдельного каталога. :ChkFilDirName rem Выполняется проверка наличия входных данных. if ""=="%~1" (exit /b -1) setlocal rem Объявляются и инициализируются переменные, использующиеся в данной процедуре. set "strFilName=%~1" call :ChkInvalidName "%strFilName%" if not ERRORLEVEL 0 (endlocal&exit /b -1) call :ChkInvalidChr "%strFilName%" if not ERRORLEVEL 0 (endlocal&exit /b -1) endlocal exit /b 0 rem Процедура проверки переданных данных на наличие недопустимых наименований. :ChkInvalidName if ""=="%~1" (exit /b -1) setlocal EnableExtensions set "INVALIDNAMES=con prn aux nul com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9" set "strChkNm=%~1" for %%F in (%INVALIDNAMES%) do (if /I "%%F"=="%strChkNm%" (endlocal&exit /b -1)) endlocal exit /b 0 rem Процедура проверки переданных данных на наличие недопустимых символов. :ChkInvalidChr if ""=="%~1" (exit /b -1) setlocal rem https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx rem https://ru.wikipedia.org/wiki/%D0%98%D0%BC%D1%8F_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0 rem https://ru.wikipedia.org/wiki/FAT#.D0.98.D0.BC.D1.8F_.D1.84.D0.B0.D0.B9.D0.BB.D0.B0_.D0.B2_FAT rem При использовании enabledelayedexpansion, экранирующий символ для символов rem циркумфлес, амперсанд и восклицательный знак удваивается. rem Символ кавычки должен быть последним. set "INVALIDCHARS0=^\ ^/ ^< ^> ^| ^+ "=" ^[ ^] ^. ^@ ";" "," ^:" rem set "INVALIDCHARS1=^^^^ ^^^! ^^^& ^"" rem Десятичные значения кодов символов из таблицы ASCII rem set "INVALIDCHARS2=33 34 37 38 42 43 47 58 59 60 61 62 63 92 94 124" set "INVALIDCHARS2=42 63" set "i=" set "chrChkChr=" set "strChkNme=%~1" rem Наименование файла или каталога не должно оканчиваться пробелом или точкой. if "."=="%strChkNme:~-1%" (endlocal&exit /b -1) if " "=="%strChkNme:~-1%" (endlocal&exit /b -1) :SplitStr2Chr setlocal EnableExtensions EnableDelayedExpansion for %%C in ("!strChkNme:~%i%,1!") do (if not ""=="%%~C" ( set "chrChkChr=%%~C"&set /a i+=1) else (endlocal&exit /b 0) ) for %%D in (%INVALIDCHARS1%) do (if ^%%D==^%chrChkChr% (endlocal&exit /b -1)) for %%E in (%INVALIDCHARS0%) do (if "%%~E"=="%chrChkChr%" (endlocal&exit /b -1)) for %%F in (%INVALIDCHARS2%) do ( cmd /c exit /b %%F&if !^=ExitCodeAscii! == ^%chrChkChr% (endlocal&exit /b -1) ) goto SplitStr2Chr endlocal exit /b 0 |
| Всего записей: 781 | Зарегистр. 01-03-2006 | Отправлено: 23:48 04-02-2017 | Исправлено: latin, 23:55 04-02-2017 |
|