Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
hammer_t
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 21
1

Как проверить наличие спецсимволов в значении переменной?

23.03.2016, 14:35. Просмотров 795. Ответов 9
Метки нет (Все метки)

Как проверить наличие спецсимволов в переменной, которая будет использоваться для имени файла и заменить их на подходящие?
Запрещеные спецсимволы, которые нельзя использовать в названии файлов или папок --> \ / ? : * " > < |
Пытаюсь это реализовать вот так:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
set /p ^NameScript=Введите имя файла:
rem Эранируя символом ^ в некоторых случаях помогает, а в некоторых нет
set NameScript=^%NameScript:\=_%
set NameScript=^%NameScript:/=_%
set NameScript=^%NameScript:?=_%
set NameScript=^%NameScript::=_%
set NameScript=^%NameScript:*=_%
set NameScript=^%NameScript:"=_%
set NameScript=^%NameScript:>=_%
set NameScript=^%NameScript:<=_%
set NameScript=^%NameScript:|=_%
echo %NameScript% <--- Вывод NameScript поле обработки
pause
В итоге в процессе тестирования, то есть прописываю в переменную спецсимвол и получаю 3 варианта, с работой с некоторыми спецсимволами обработка происходит нормально, а с другие останавливают работу скрипта...
Первый:
Код
Неожиданное появление =_%
Второй:
Код
Введите имя скрипту:dfgher|
Ошибка в синтаксисе команды.
Вопрос: Как правильно экранировать замену спецсимвола в таком случае?
Всем участвующем в решении вопроса заранее огромное спасибо
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2016, 14:35
Ответы с готовыми решениями:

Как по FTP передать файл с именем, основанном на значении переменной DATE?
Всем привет. Необходимо содержимое папки запаковать в архив, далее залить его...

Как проверить наличие раздела реестра?
Как? :)

Как проверить наличие файла через ftp?
Как проверить наличие файла через ftp? open mysite.com user pass cd...

Как проверить наличие разрешений на чтение содержимого директории?
Приветствую ! Нужен простой способ, чтобы проверить есть ли права на чтение...

Пробелы в значении переменной
@echo off if %1 == KhZ910U9 ( goto m1 ) else ( goto m2 ) :m1 set...

9
Dragokas
Эксперт WindowsАвтор FAQ
17053 / 7109 / 860
Регистрация: 25.12.2011
Сообщений: 10,920
Записей в блоге: 16
24.03.2016, 20:12 2
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@echo off
SetLocal EnableExtensions
 
set "name=> \ / ? : 1 * 2 > < | " * 3"
 
set "name=%name:>=_%"
set "name=%name:<=_%"
set "name=%name:/=_%"
set "name=%name:\=_%"
set "name=%name:?=_%"
set "name=%name::=_%"
set "name=%name:|=_%"
set "name=%name:"=_%"
 
:rpt
for /f tokens^=1*^ delims^=*^ eol^= %%a in ("%name%") do (
  if defined ret (set "ret=%ret%_%%a") else set "ret=%ret%%%a"
  set "name=%%b"
  if "%%b" neq "" goto rpt
)
 
echo "%ret%"
 
pause
1
hammer_t
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 21
25.03.2016, 13:53  [ТС] 3
Угу, протестил, работает! Спасибо большое Dragokas
Тогда еще если можно, помогите еще если можнете с такой траблой, если использую символ | получаю то что в примере ниже:
Windows Batch file
1
2
set /p ^NameScript=Введите имя файла:|
Ошибка в синтаксисе команды.
Такое как то можно обработать? В VB6 такое можно обрабатывать так: OnErrorGoTo: Error01, ну или что то типа такого, я уже точно не помню синтаксиса, но такие обработки делать можно
0
greg zakharov
Покинул форум
2211 / 880 / 248
Регистрация: 07.05.2015
Сообщений: 1,764
25.03.2016, 16:02 4
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@echo off
  setlocal enabledelayedexpansion
    set /p "str=Enter folder name: "
    set "i=0"
    :repeat
      set "c=!str:~%i%,1!"
      if "!c!" neq "" (
        set /a "i+=1"
        (echo "!c!" |>nul findstr /rc:"[?*|\\/><]")&&(
          set "name=!name!_"
        )||(set "name=!name!!c!")
        goto:repeat
      )
    echo !name:"=_!
  endlocal
exit /b
Пример работы:
Код
E:\sandbox> test.cmd
Enter folder name: _"dir?>*\str/"
__dir____str__

E:\sandbox>
0
hammer_t
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 21
25.03.2016, 16:20  [ТС] 5
Спасибо, решение от greg zakharov работает, но не кушало двоеточие, ниже этот же пример, только я экранировал двоеточие и теперь обрабатывает все спец символы
Еще раз спасибо всем за помощь!
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off
  setlocal enabledelayedexpansion
    set /p "str=Enter folder name: "
    set "i=0"
    :repeat
      set "c=!str:~%i%,1!"
      if "!c!" neq "" (
        set /a "i+=1"
        (echo "!c!" |>nul findstr /rc:"[?*|\\/><^:]")&&(
          set "name=!name!_"
        )||(set "name=!name!!c!")
        goto:repeat
      )
    echo !name:"=_!
  endlocal
exit /b
pause
0
Dragokas
Эксперт WindowsАвтор FAQ
17053 / 7109 / 860
Регистрация: 25.12.2011
Сообщений: 10,920
Записей в блоге: 16
28.03.2016, 16:49 6
Цитата Сообщение от hammer_t Посмотреть сообщение
Тогда еще если можно, помогите еще если можнете с такой траблой, если использую символ | получаю то что в примере ниже:
Windows Batch file
1
2
set /p ^NameScript=Введите имя файла:|
Ошибка в синтаксисе команды.
Windows Batch file
1
set /p "NameScript=Введите имя файла:|"
0
Victor_Man
0 / 0 / 0
Регистрация: 18.10.2014
Сообщений: 3
13.01.2017, 19:27 7
Dragokas
Интересно, почему не работает приведенный пример последовательности символов - скрипт просто вылетает.
Причем из последовательности просто удалена уже работавшая в Source
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@echo off
SetLocal EnableExtensions
rem Working - Source
rem set "name=>\/?:1*2><|"*3"
 
rem Working
rem set "name=1234567890 >\/?:1*2><|"*3  ()\/:?"*|<>   09874321"
 
rem NOT Working
set "name=1234567890 ()\/:?"*|<>   09874321"
 
set "name=%name:(=_%"
set "name=%name:)=_%"
set "name=%name:>=_%"
set "name=%name:<=_%"
set "name=%name:/=_%"
set "name=%name:\=_%"
set "name=%name:?=_%"
set "name=%name::=_%"
set "name=%name:|=_%"
set "name=%name:"=_%"
 
:rpt
for /f tokens^=1*^ delims^=*^ eol^= %%a in ("%name%") do (
  if defined ret (set "ret=%ret%_%%a") else set "ret=%ret%%%a"
  set "name=%%b"
  if "%%b" neq "" goto rpt
)
echo "%ret%"
Pause
0
alpap
1812 / 1330 / 433
Регистрация: 26.04.2015
Сообщений: 4,552
14.01.2017, 05:11 8
Допустим такой вариант проверки запрещенных символов для имени в переменной или подаче откуда-то, единственно я не брал в расчет кавычки (надо отдельно дорабатывать, но лучше чтобы просто не было):
Windows Batch file
1
2
3
4
5
6
7
8
@echo off
set "ss=* < > \ / | ? :"
call :# "slo* < > \ / | ? :vo"
pause& exit
 
:#
 for /f "delims=" %%a in ('cmd/v/c echo !ss!') do echo "%~1"|>nul findstr "%%a" && echo Есть запрещенный символ
exit/b
0
InDevRus
25 / 25 / 7
Регистрация: 23.01.2017
Сообщений: 94
23.01.2017, 01:41 9
Проверить то легко:

Windows Batch file
1
echo "%var%"|findstr /r [*^\^/^?^:^"^>^<]
Вот заменить сложнее будет
0
alpap
1812 / 1330 / 433
Регистрация: 26.04.2015
Сообщений: 4,552
23.01.2017, 03:40 10
InDevRus,
вы наверное не поняли что в моем коде любой из заданных символов выводится, а значит и заменяется.
0
23.01.2017, 03:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2017, 03:40

Замена символов в значении переменной
Доброго времени суток! Есть два файла: 1. config.ini: 2....

Замена символов в значении переменной
Есть код который работал без помех (даты изымаемые из имени файла я в примере...

Замена определённого символа в значении переменной другим
Здравствуйте, можно ли считать фразу из txt файла в переменную и в переменной в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru