0 / 0 / 0
Регистрация: 26.04.2015
Сообщений: 2
1

Восклицательные знаки и знаки процента в именах файлов

02.10.2015, 17:37. Показов 11764. Ответов 1
Метки нет (Все метки)

Здравствуйте! Помогите решить задачу.
Коротко: Проблема в знаках ! и % в именах файлов. (Восклицательный знак и знак процента)

P.S. Знаю, что подобные темы были, но они решают лишь часть проблемы - либо знака ! либо знака %.
Но в именах файлах встречаются разные символы. Неужели батник не способен справиться с такими именами?
Если так, то его универсальность сводится к нулю. Что печально.

Подробнее:
Задача обработать все файлы жесткого диска.
Сначала собирается хеш-лист всех файлов сторонней утилитой (к которой претензий нет).
Она же записывает список всех файлов с их хешами в txt файл юникод.
Далее считываем из него построчно текст, в котором хеш и имя файла. Отделяем их.
Далее обрабатываем файл, указанный в данной строке. С хешем проблем нет. А вот с файлами беда.
Знаки встречаютеся разные. ! @ # $ % ^ & ( ) _ - = + { } [ ] ' ; ` ~
Но основной проблемой стало побороть два знака ! и %
По-отдельности есть варианты, но эти два знака как антиподы. Они противоречат друг другу.

P.P.S. для перебора используется цикл такого вида
for /f "tokens=*" %%A in (%~1) Do (...%%A...)
В котором %~1 параметр переданный по Call ... Который является путем к текстовому файлу с нашим списком.
%%A - строка с возможными знаками ! или % или вместе... или даже по несколько штук, типа !!!!%%%!!!.txt
Но для упрощения понимания проблемы, было решено сократить их до самой сути. Прилагаю файлы и дублирую их содержание здесь.

файл: !%.txt
задача его переименовать в %!.txt
с помощью батника:
test.cmd
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
31
32
ECHO VARIANT 1
@echo off
set "a=!%.txt"
set "b=%!.txt"
ren %a% %b%
ECHO SMOTRIM RESULTAT GLAZAMI V PAPKE
pause
 
ECHO VARIANT 2
ECHO PROBUEM PO-DRUGOMU
Setlocal EnableDelayedExpansion EnableExtensions
set "a=!%.txt"
set "b=%!.txt"
ren !a! !b!
ECHO SMOTRIM RESULTAT GLAZAMI V PAPKE
pause
 
ECHO VARIANT 3
ECHO PROBUEM PO-DRUGOMU
setlocal disabledelayedexpansion
set "a=!%.txt"
set "b=%!.txt"
ren %a% %b%
setlocal enabledelayedexpansion
ECHO SMOTRIM RESULTAT GLAZAMI V PAPKE
pause
 
ECHO VARIANT 4
ECHO PROBUEM PO-DRUGOMU
ren !%.txt %!.txt
ECHO SMOTRIM RESULTAT GLAZAMI V PAPKE
pause
И в результате, даже просто выполнить команду "ren !%.txt %!.txt" батником не удается. Что уже говорить переименовании с помощью переменных и уж тем более в цикле.

P.P.P.S На данном форуме находил решение вопроса в пользу одного из знаков. Например, делаем "setlocal disabledelayedexpansion" перед работой с переменной, где есть знак "!". Или наоборот, включаем "setlocal enabledelayedexpansion" для работы со знаком %, а вот чтобы и то и другое - ну никак.
Прошу помощи.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Вложения
Тип файла: zip voskl_procent.zip (2.0 Кб, 8 просмотров)
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2015, 17:37
Ответы с готовыми решениями:

Знаки процента в имени папки
Доброго времени суток! Хотел написать скрипт на чистку файлов в папке. Проблема в том, что в...

После dos navigator вместо русских букв в именах файлов вопросительные знаки
После работы с ДОС навигатором вместо русских букв в именах файлов и каталогов появились ????...

Добавить восклицательные знаки
Как перезаписать - это получилось, а вот как восклицательные знаки добавить - не знаю Имеется...

В диспетчере устройств восклицательные знаки
Ребят , в диспечере устройст восклицательные знаки , у Ethernet контролера и у Сопроцессора .

1
3445 / 1983 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
02.10.2015, 19:24 2
Лучший ответ Сообщение было отмечено ComSpec как решение

Решение

Windows Batch file
1
2
3
4
5
:: Variant 1
@echo off
set "a=!%%.txt"
set "b=%%!.txt"
ren "%a%" "%b%"
;
Windows Batch file
1
2
3
4
5
6
:: Variant 2
@echo off
setlocal enabledelayedexpansion
set "a=^!%%.txt"
set "b=%%^!.txt"
ren "!a!" "!b!"
;
Windows Batch file
1
2
3
4
5
6
:: Variant 3 == Variant 1
@echo off
setlocal disabledelayedexpansion
set "a=!%%.txt"
set "b=%%!.txt"
ren "%a%" "%b%"
;
Windows Batch file
1
2
3
4
:: Variant 4
@echo off
setlocal enabledelayedexpansion
ren ^^!%%.txt %%^^!.txt
;
Windows Batch file
1
2
3
4
:: Variant 5
@echo off
setlocal enabledelayedexpansion
ren "^!%%.txt" "%%^!.txt"
;
Windows Batch file
1
2
3
4
5
6
:: Variant 6
@echo off
setlocal enabledelayedexpansion
set a=^^!%%.txt
set b=%%^^!.txt
ren "!a!" "!b!"
и т. п.

Символ процента нужно удваивать, а восклицательнй знак в случае отложенного расширения переменных -- экранировать одним (если он находится внутри кавычек) или двумя (когда кавычки отсутствуют) символами "^".

Встречаются и более сложные случаи, например, когда надо учетверять символы процента или экранировать восклицательный знак тремя символами "^", но на практике они редки.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2015, 19:24

Отформатировать восклицательные знаки в строке
Замена в строках. Дана строка. Отформатировать восклицательные знаки в строке.

Заменить все восклицательные знаки точками
Даны натуральное число n, символы s1, …, sn. Преобразовать последовательность s1, …, sn, заменив в...

Программа выводит лишние восклицательные знаки)
Вот сама задача: Написать программу, которая считывает из текстового файла три предложения и...

Заменить все точки на восклицательные знаки
Написать программу, которая считывает текст из файла и выводит его на экран, заменив все точки на...


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

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

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