Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 12

Модерирует : KLASS, IFkO

KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows
 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

   

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
   

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 12
KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru