[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 2 месяца
  • Сообщений: 3605
  • Репутация:127

    [+] [-]
loban_ser, я предлагаю тебе опробовать свой вариант на себе. Чтобы ты лучше понял, о чём идет речь, помести файл в папку C:\Windows\System32 и расширение дай нормальное: dll или exe. А потом смело запускай свою команду!

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Ander_73
Проблема с перекодировками
Если поставить в начало chcp 1251, то файл нормально удаляется (батник должен быть в ANSI)
Но в 1251 этот символ имеет код 0x95 .

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 2 месяца
  • Сообщений: 3605
  • Репутация:127

    [+] [-]
nikzzzz, не понял.
set "fname=\path\* name.txt"
chcp 1251
del /q "%fname%"
Ну, ясно, что * - это 0х7 как-бы...
Не работает ни разу. Я пробовал перекодировки. И 1251 и 65001. И vbs пробовал.
Стал бы я вопросы задавать...
Добавлено через 10 минут 45 секунд:
Вообще, конкретно данный случай можно обойти так:
set "fname=\path\* name.txt"
...
set "fname=%fname:*=?%"
del "%fname%"
* - это 0х7 якобы; ... и то при условии, что в папке больше нет файлов вида "? name.txt" ac
Но хотелось бы общего решения...

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
Ander_73,
71613не понял.
chcp 1251
set "fname=\path\* name.txt"
del /q "%fname%"
* - код 0x95
Код символа я посмотрел так
chcp 1251
for /f "delims=" %%a in ('dir /b *name.txt') do set file="%%a"
echo %file%
>file.asc echo %file%
Далее посмотрел file.asc в hex редакторе

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 2 месяца
  • Сообщений: 3605
  • Репутация:127

    [+] [-]
nikzzzz, если снимать листинг в 1251, то да. А если есть только листинг в 866?

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
71615А если есть только листинг в 866?
Батник не воспринимает коды <0x20, если только как-то через переменные передавать.

[Цитировать]

    stea.61
  • 2490
  • Стаж: 8 лет 3 месяца
  • Сообщений: 656
  • Репутация:67

    [+] [-]
  • Откуда: 61 RUS
Всем привет.
71617Батник не воспринимает коды <0x20, если только как-то через переменные передавать.
Возможно ошибаюсь, но в случае, приведенном Ander_73 в качестве примера, и не требуется в батнике использовать код - нужно лишь присвоить переменной %fname% правильное имя файла.
Например, в каталоге "\Totalcmd\Plugins\WFX\WebDAV" приложенного архива находится файл с именем "• WebDAV.info".
bat-ник
chcp 1251
set "fname=\path\• WebDAV.info"
del /q "%fname%"
прекрасно исполняется.

[Цитировать]

    Gemostarter
  • 15956
  • Стаж: 7 лет
  • Сообщений: 324
  • Репутация:35

    [+] [-]
Ander_73, вставить символ BEL (и любой другой) прямо в батник, не?
З.Ы. В порядке "побурчать": как бедный cmd ещё не надорвался от задач, что вы на него возлагаете...

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 2 месяца
  • Сообщений: 3605
  • Репутация:127

    [+] [-]
stea.61, nikzzzz уже дал этот вариант. Если изначально получать имя файла в 1251, то всё ок.
Именно потому, что в этом случае получаем 0х95, который команда DEL нормально воспринимает.
nikzzzz, как раз в переменной всё отлично. И символ 0х7 там тоже "прокатывает". Треш начинается при "консольном выводе" (не знаю, как правильнее выразить), когда 0х7 не выводится, а обрабатывается, то есть играется "колокольчик" (BEL).
На данный момент формулирую так: как имея листинг в 866 таки удалить проклятый файл?

[Цитировать]

    UserX
  • 667
  • Стаж: 9 лет
  • Сообщений: 795
  • Репутация:32

    [+] [-]

результат поставленной задачи (пардон)

71622как имея листинг в 866 таки удалить проклятый файл?
Результат задачи:
Выведено из строя (сгорело) 3 инженера и бессчётное количество завсегдатаев...
ah

[Цитировать]

    stea.61
  • 2490
  • Стаж: 8 лет 3 месяца
  • Сообщений: 656
  • Репутация:67

    [+] [-]
  • Откуда: 61 RUS
71622как имея листинг в 866 таки удалить проклятый файл?
Привет.
А если все же просто менять кодовую страницу по ходу bat-ника?
В начале можно сформировать нужный набор символов в виде переменных и использовать их по мере надобности.
Примерно так:
chcp 1251
set "s1=•" & set "s2=©" & set "s3=±"
chcp 866
del /q "\Totalcmd\Plugins\WFX\WebDAV\%s1% WebDAV.info"
Ну, или можно задать список символов и использовать его в циклах:
chcp 1251
set "s1=•" & set "s2=©" & set "s3=±" & set "tbs=• © ±"
chcp 866
for %%i in (%tbs%) do (
del /q "\Totalcmd\Plugins\WFX\WebDAV\%%i WebDAV.info"
)
Не сгодится?

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 2 месяца
  • Сообщений: 3605
  • Репутация:127

    [+] [-]
stea.61, aa
Я же говорил, хочется общего решения проблемы, а не конкретно "с символом 0х7 в начале имени файла".
Если есть возможность пересоздать листинг файлов в 1251, то проблема решается, тоже уже говорил.
Теперь хочется придумать, как быть, если у меня уже есть листинг, но в кодировке 866.

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 2 месяца
  • Сообщений: 578
  • Репутация:24

    [+] [-]
Ander_73, aa
может получится что-нибудь придумать с такой комбинацией
Использовать флаг и выполнить chcp 866 всего 1 раз, и затем сразу сбросить флаг
@Echo off
SetLocal
chcp 1251>nul
set "fil=• WebDAV.dll"
Set LanguageFlag=true
If Not Exist TEMP md TEMP
for /f "delims=" %%A in ('dir /b /s /a:-d "%Fil%"') do (
  if defined LanguageFlag (chcp 866>nul& Set LanguageFlag=)
  chcp
  Echo %%A
  copy /y "%%A" "TEMP\%%~nxA"
  del /q "TEMP\%Fil%"
)
как пример
Предварительно записать имена файлов во временный файл. Вернуть кодировку по-умолчанию. Циклом читать данные из сформированного файла.
Echo off
SetLocal
chcp 1251>nul
set "fil=• WebDAV.dll"
If Not Exist TEMP md TEMP
dir /b /s /a:-d "%Fil%">%temp%\tempfile.tmp
for /f "UseBackQ delims=" %%A in ("%temp%\tempfile.tmp") do (
  Echo %%A
  copy /y "%%A" "TEMP\%%~nxA"
)
chcp 866>nul
del "%temp%\tempfile.tmp"
chcp
pause
в батнике оформить как фунцию
@for %i in ("• *") do chcp 1251>nul&&del /q "%i"&&chcp 866
@for %i in ("? *") do chcp 1251>nul&&del /q "%i"&&chcp 866

[Цитировать]

    qwea2005
  • 1759
  • Стаж: 8 лет 6 месяцев
  • Сообщений: 75
  • Репутация:3

    [+] [-]
71613Не работает ни разу. Я пробовал перекодировки. И 1251 и 65001. И vbs пробовал.
Ander_73, что интересно в PowerShell эта задачка решается одной строчкой, к примеру так, не зависимо где в имени находится спецсимвол
ls -r c:\0\ *•* | rm
, а вот через батник ah Вот вам и простая задачка. Получилось ли у Вас решить?

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 2 месяца
  • Сообщений: 578
  • Репутация:24

    [+] [-]
qwea2005,
aa
в PowerShell вообще много чего можно, там встроен полноценный движок по регулярка,нежели в cmd, но лучше всего с этим справляется перл

Страница 2 из 3


Показать сообщения:    

Текущее время: 19-Апр 18:16

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы