cmd for восклицательные знаки
Модератор: Tim308
- dyxen
- Постоянный пользователь
- Сообщения: 229
- meble kuchenne PL this is the official website
- Зарегистрирован: 25 мар 2018, 18:01
cmd for восклицательные знаки
Нужно сделать cmd скрипт который в определенной папке искал все файлы и определенным образом обрабатывал ВКЛЮЧАЯ файлы-папки с восклицательными знаками.
Например такой код
например у меня в папке "d:\dir1"
3 файла ".mp3"
muz1.mp3
muz2.mp3
muz3_!.mp3
"muz3_!.mp3" отображается "muz3_.mp3" (без восклицательного знака).
И соответственно файл не правильно обрабатывается.
Подобное было и с папками.
Если есть знающие, подскажите пожлста, есть ли какой-то оптимальный способ, чтобы корректно это все работало?
PS:
Например такой код
Код: Выделить всё
@echo off
setlocal EnableDelayedExpansion
set aimp=c:\program files\aimp3\aimp3.exe
set dir1=d:\dir1
set num=0
set list=
for /r "%dir1%" %%R in (
"*.mp3"
) do (
set /a num+=1
set list=!list! "%%R"
echo file[!num!]=%%~nxR
)
echo list=%list%
rem start "" "%aimp%" /add_play %list%
echo.
pause
exit /b
3 файла ".mp3"
muz1.mp3
muz2.mp3
muz3_!.mp3
"muz3_!.mp3" отображается "muz3_.mp3" (без восклицательного знака).
И соответственно файл не правильно обрабатывается.
Подобное было и с папками.
Если есть знающие, подскажите пожлста, есть ли какой-то оптимальный способ, чтобы корректно это все работало?

- DesignerMix
- Администратор
- Сообщения: 6719
- Зарегистрирован: 25 апр 2014, 10:51
- Откуда: Белгород
- Контактная информация:
cmd for восклицательные знаки
Если убрать setlocal EnableDelayedExpansion и заменить !! На %% то в именах файлов появятся восклицательные знаки, но пропадает нумерация (всегда 0 в переменной num) и в list отображается только последний файл...
Блин, завтра еще голову поломаю, сегодня уже спать пора.
Блин, завтра еще голову поломаю, сегодня уже спать пора.
cmd for восклицательные знаки
Я не в первый раз, не первый день вожусь с этим "!". Давно вожусь... Ситуация (точнее синтаксис языка cmd + "!") хуже чем кажется на первый взгляд. Я пробовал и for с вложенным "dir /b" (dir показывает файлы в папке/ах), ну что-то типо
но пока безрезультатно
Где-то ещё писали заменить "!" на переменную
set w=!
но это применимо если вручную указывать имя файла/папки
Пробовал варианты
^!
^^!
^^^!
...
безрезультатно
"for" упорно не хочет видеть что "!" это часть имени а не команда
Из-за мелочи полезная команда сводится к минимуму
Код: Выделить всё
for /f "usebackq delims= tokens=*" %%R in (
`dir "%dir1%\*.mp3" /b`
) do (
...
)
Где-то ещё писали заменить "!" на переменную
set w=!
но это применимо если вручную указывать имя файла/папки
Пробовал варианты
^!
^^!
^^^!
...
безрезультатно
"for" упорно не хочет видеть что "!" это часть имени а не команда
Из-за мелочи полезная команда сводится к минимуму
- DesignerMix
- Администратор
- Сообщения: 6719
- Зарегистрирован: 25 апр 2014, 10:51
- Откуда: Белгород
- Контактная информация:
cmd for восклицательные знаки
dyxen, пока безрезультатно. Я всего пару раз писал такие скрипты... Надо читать мануалы. Если что получится напишу.
Отправлено спустя 45 минут 19 секунд:
И еще - я правильно понимаю что вам нужно сформировать список файлов (каждый файл в кавычках и с полным путем включая расширение) в папке и вложенных папках и потом передать этот спискок для формирования плейлиста в aimp?
Если это все что вам нужно и если это то, ради чего в принципе пишется скрипт то может проще будет средствами самого aimp'а это сделать. Скажите подходит-ли вам такой вариант и я попробую себе поставить AIMP и потестировать, я уверен что там такое можно сделать.
Отправлено спустя 45 минут 19 секунд:
И еще - я правильно понимаю что вам нужно сформировать список файлов (каждый файл в кавычках и с полным путем включая расширение) в папке и вложенных папках и потом передать этот спискок для формирования плейлиста в aimp?
Если это все что вам нужно и если это то, ради чего в принципе пишется скрипт то может проще будет средствами самого aimp'а это сделать. Скажите подходит-ли вам такой вариант и я попробую себе поставить AIMP и потестировать, я уверен что там такое можно сделать.
cmd for восклицательные знаки
DesignerMix
скрипт который я привёл в 1 посте - основная схема которая я хотел бы знать,
как работает, так, как она вообще, так сказать, "по задумке", должна работать. - это основная идея, цель, с которой я создал эту тему.
В данной ситуации это не "жизненно-важная проблема", я хотел бы просто знать это, надо было сразу жирно написать, "вопрос коварный, если не программист CMD со стажем - лучше и не пытайся решить".
Я, мне удалось прийти к решению (ну, ещё в 1-2 раз когда с этим "!" столкнулся):
* отключить "setlocal EnableDelayedExpansion"
* использовать только "%" и обрабатывать файлы по одному
тогда всё работает как надо и "!" распознаётся нормально.
Я это написал по принципу "а вдруг...".
Будут идеи - напиши/те, нет - ладно, переживу...
Мне вообще всё больше думается что эта схема (код в 1 посте) вообще не решаема, хотя я и видел где-то человек писал что он сумел правильно обрабатывать вообще все спец-символы в своих cmd-файлах.
Мне нужно чтобы при любых операциях при использовании for и "setlocal EnableDelayedExpansion" знаки "!" в именах файлов обрабатывались прпавильно.
Мне не обязательно именно для AIMP, хоть .txt для блокнота...
Списки файлов заключённые в кавычки с полными путями нужны обязательно, не то чтоб сильно горело, но в рамках данной темы они актуальны (про имена и расширения "%~nR" "%~xR" "%~nxR" итп в команде for я разобрался).
И конечно очень хочется добавлять нумерацию "по желанию, где хочу", а не только где надо, но это второстепенно.
Чувствую придётся для обработки списка файлов учить другой язык
.
Отправлено спустя 17 минут 42 секунды:
Хотя конечно для работы это нужно, по любому найдётся полезное применение... (списки, поиск в папках, нумерация...)
Я наверно попутно где-нибудь ещё спрошу...
Вообще не хочу чтобы из-за этого кто-то надрывался (сам занимался этим, знаю что это
) - так, не в напряг 
Ну и на крайняк если знаете похожий язык, не очень сложный но достаточный для элементарных простых операций подскажите, я даже у NirSoft.net такое видел, но подробно не смотрел, двд-привод им открываю иногда
.
скрипт который я привёл в 1 посте - основная схема которая я хотел бы знать,
как работает, так, как она вообще, так сказать, "по задумке", должна работать. - это основная идея, цель, с которой я создал эту тему.
В данной ситуации это не "жизненно-важная проблема", я хотел бы просто знать это, надо было сразу жирно написать, "вопрос коварный, если не программист CMD со стажем - лучше и не пытайся решить".
Я, мне удалось прийти к решению (ну, ещё в 1-2 раз когда с этим "!" столкнулся):
* отключить "setlocal EnableDelayedExpansion"
* использовать только "%" и обрабатывать файлы по одному
тогда всё работает как надо и "!" распознаётся нормально.
Я это написал по принципу "а вдруг...".
Будут идеи - напиши/те, нет - ладно, переживу...
Мне вообще всё больше думается что эта схема (код в 1 посте) вообще не решаема, хотя я и видел где-то человек писал что он сумел правильно обрабатывать вообще все спец-символы в своих cmd-файлах.
Мне нужно чтобы при любых операциях при использовании for и "setlocal EnableDelayedExpansion" знаки "!" в именах файлов обрабатывались прпавильно.
Мне не обязательно именно для AIMP, хоть .txt для блокнота...
Списки файлов заключённые в кавычки с полными путями нужны обязательно, не то чтоб сильно горело, но в рамках данной темы они актуальны (про имена и расширения "%~nR" "%~xR" "%~nxR" итп в команде for я разобрался).
И конечно очень хочется добавлять нумерацию "по желанию, где хочу", а не только где надо, но это второстепенно.
Чувствую придётся для обработки списка файлов учить другой язык

Отправлено спустя 17 минут 42 секунды:
Хотя конечно для работы это нужно, по любому найдётся полезное применение... (списки, поиск в папках, нумерация...)
Я наверно попутно где-нибудь ещё спрошу...
Вообще не хочу чтобы из-за этого кто-то надрывался (сам занимался этим, знаю что это


Ну и на крайняк если знаете похожий язык, не очень сложный но достаточный для элементарных простых операций подскажите, я даже у NirSoft.net такое видел, но подробно не смотрел, двд-привод им открываю иногда

- DesignerMix
- Администратор
- Сообщения: 6719
- Зарегистрирован: 25 апр 2014, 10:51
- Откуда: Белгород
- Контактная информация:
cmd for восклицательные знаки
powershell
cmd for восклицательные знаки
Посмотрел powershell. Ух что-то непростая она, поискал самые простые операции: вывод сообщения (по аналогии в cmd - echo), приостановка в конце .ps1 файла... что-то как-то не очень получается, даже приостановку в конце не получилось сделать, правда я ей (powershell) вообще не занимался, может со временем это всё будет проще, но пока не очень... и до работы с аналогом "for" (в cmd) наверно мне далеко...
Отправлено спустя 2 минуты 41 секунду:
но да ладно, мне желательно чтобы командный файл можно было запускать с флешки на любом компе, желательно без установки в систему допрлнительных компонентов, может чего ещё найду...
Отправлено спустя 2 минуты 41 секунду:
но да ладно, мне желательно чтобы командный файл можно было запускать с флешки на любом компе, желательно без установки в систему допрлнительных компонентов, может чего ещё найду...
- DesignerMix
- Администратор
- Сообщения: 6719
- Зарегистрирован: 25 апр 2014, 10:51
- Откуда: Белгород
- Контактная информация:
cmd for восклицательные знаки
dyxen, на семерке и выше powershell есть в системе, правда в некоторых случаях он просто отключен (нужно включать в компонентах Windows). Нашел ПО где можно скрипты на PS визуально делать, если получится решить там вашу задачу то отпишусь.
cmd for восклицательные знаки
у меня и своя сейчас Win XP и везде часто Win XP
Отправлено спустя 1 минуту 3 секунды:
устанавливал отдельно на Win XP
- DesignerMix
- Администратор
- Сообщения: 6719
- Зарегистрирован: 25 апр 2014, 10:51
- Откуда: Белгород
- Контактная информация:
cmd for восклицательные знаки
dyxen, понятно. Ну тогда я в вашем вопросе бесполезен. Удаляюсь
cmd for восклицательные знаки
если это потому что XP то нет, на XP powershell работает без проблем, просто её нужно устанавливать отдельно.
Ну, это надо у программистов спрашивать, я где-нибудь ещё спрошу, найду ответ отпишусь
(ну не обязательно именно в cmd, может отдельной портативной утилитой...)
- DesignerMix
- Администратор
- Сообщения: 6719
- Зарегистрирован: 25 апр 2014, 10:51
- Откуда: Белгород
- Контактная информация:
cmd for восклицательные знаки
Я то знаю, но вы писали: мне желательно чтобы командный файл можно было запускать с флешки на любом компе, желательно без установки в систему допрлнительных компонентов ... у меня и своя сейчас Win XP и везде часто Win XP.
Так что работа с powershell похоже вас не устроит т.к. нужно будет устанавливать что-то дополнительно (если система будет XP там где вы захотите впервые запустить скрипт)
cmd for восклицательные знаки
DesignerMix, если есть интересные идеи на powershell напишите пжлста
, ну если не точно то "около" той схемы, задачи которую я запросил в 1 посте.
во 1-х со многими системами XP я работаю постоянно, во 2-х если дело стоящее то установлю powershell (благо есть /quiet),
по всему видно он мощнее, может чего получше получится...

во 1-х со многими системами XP я работаю постоянно, во 2-х если дело стоящее то установлю powershell (благо есть /quiet),
по всему видно он мощнее, может чего получше получится...
- DesignerMix
- Администратор
- Сообщения: 6719
- Зарегистрирован: 25 апр 2014, 10:51
- Откуда: Белгород
- Контактная информация:
cmd for восклицательные знаки
Вот такой скрипт ищет файлы в папке (+подпапках этой папки) и по маске расширения передаваемым в качестве параметров запуска этого скрипта.
Запускать скрипт вот так:
Находясь в директории со скриптом выполнить: .\имя_скрипта.ps1 -FolderPath 'E:\путь\до\папки' -FileExtension '.расширение'
Сам скрипт (я поправил чтобы выводился полный путь до файлов):
Понимаю что это в чистом виде не то что вам нужно, но это самое похожее что я смог найти.
Вот так выглядит результат выполнения скрипта:
Запускать скрипт вот так:
Находясь в директории со скриптом выполнить: .\имя_скрипта.ps1 -FolderPath 'E:\путь\до\папки' -FileExtension '.расширение'
Сам скрипт (я поправил чтобы выводился полный путь до файлов):
Код: Выделить всё
param
(
[parameter()][string] $FolderPath,
[parameter()][string] $FileExtension
)
$Result = (Test-Path($FolderPath));
If ($Result)
{
$Dir = get-childitem $FolderPath -recurse
$List = $Dir | where {$_.extension -eq $FileExtension} | % {Write-Host $_.FullName}
$List | format-table Name
}
else
{
"Folder path is incorrect."
}
function TestPath()
{
$FileExists = Test-Path $FolderPath
If ($FileExists -eq $True)
{
Return $true
}
Else
{
Return $false
}
}
Вот так выглядит результат выполнения скрипта:
cmd for восклицательные знаки
Я создал cmd файл в директории .ps1 - файла, запустил его с указанными параметрами и... открылся блокнот.
Создал 2-й .ps1 файл написал там
, стыдоба, как приостановить его в конце?
И ещё
Отправлено спустя 1 час 56 минут 57 секунд:
Я тут на одном форуме спросил, мне подсказали интересную вещь
подкоррктировав свой код получилось при сохранении "!" сдлать рабочую нумерацию, но в вид списка пока не работает
здесь даже aimp и .mp3 файлы не обязательны (в смысле для примера, при желании можно и их прикрутить)
Отправлено спустя 31 минуту 54 секунды:
К.хе, сумел наконец запустить .ps1 - файл (через саму консоль powershell, я привык 2х-клиом на ".cmd" ".ps1" файлах). Результат такой же как на приведенном выше скриншоте.
Ну, тут остаётся, кажется:
[*] заключить все строки в кавычки
[*] сделать в виде списка (убрать "перенос строк" в конце)
[*] и узнать как запустить какое либо приложение с параметрами - этим самым полученным списком.
Отправлено спустя 5 минут 52 секунды:
на заметку
Создал 2-й .ps1 файл написал там
ПКМ по файлу - выполнить в powershell - промелькнуло окошко, закрылось и всёDesignerMix писал(а): ↑12 апр 2018, 23:08.\имя_скрипта.ps1 -FolderPath 'E:\путь\до\папки' -FileExtension '.расширение'


Я тут на одном форуме спросил, мне подсказали интересную вещь
подкоррктировав свой код получилось при сохранении "!" сдлать рабочую нумерацию, но в вид списка пока не работает
Код: Выделить всё
@echo off
set num=0
set list=
for %%R in (a b c) do (
set Var1=%%R
set /a num+=1
setlocal EnableDelayedExpansion
set list=!list! "!Var1!"
echo file[!num!]=!Var1!
endlocal
)
echo.
echo list=%list%
echo.
pause
exit /b
Отправлено спустя 31 минуту 54 секунды:
К.хе, сумел наконец запустить .ps1 - файл (через саму консоль powershell, я привык 2х-клиом на ".cmd" ".ps1" файлах). Результат такой же как на приведенном выше скриншоте.
Ну, тут остаётся, кажется:
[*] заключить все строки в кавычки
[*] сделать в виде списка (убрать "перенос строк" в конце)
[*] и узнать как запустить какое либо приложение с параметрами - этим самым полученным списком.
Отправлено спустя 5 минут 52 секунды:

- DesignerMix
- Администратор
- Сообщения: 6719
- Зарегистрирован: 25 апр 2014, 10:51
- Откуда: Белгород
- Контактная информация:
cmd for восклицательные знаки
)) я также пробовал, но в цикле как только endlocal то он "забывает" list. Но вот задать Var1 я не додумался и нумерация у меня тоже не работала как надо.
Понимаю, но с чего-то надо было начать. Буду пробовать сделать остальное.
На это и надеюсь, а так понятно что в cmd можно вывести имена, было-бы удивительно если этого сделать было нельзя.
cmd for восклицательные знаки
ЕСТЬ РЕШЕНИЕ!
Хм.
Мне на форуме дали скорректированный код на cmd который РАБОТАЕТ!
я проверил у себя, всё работает, и восклицательные знаки в именах, и списки, и нумерация.
И в aimp-е всё запустилось.
Отправлено спустя 4 минуты 48 секунд:
И код кажется ровный, без лишних сложностей и диких перекосов.
Хм.
Мне на форуме дали скорректированный код на cmd который РАБОТАЕТ!
Код: Выделить всё
@echo off
set aimp=c:\program files\aimp3\aimp3.exe
set dir1=d:\dir1
set num=0
set list=
for /r "%dir1%" %%R in (
"*.mp3"
) do CALL :process "%%R"
echo.
echo list=%list%
rem start "" "%aimp%" /add_play %list%
echo.
pause
exit /b
::exit строкой выше не удалять!
::Подпрограмма
:process
set /a num+=1
set list=%list% %1
echo file[%num%]=%~nx1
EXIT /b 0
И в aimp-е всё запустилось.
Отправлено спустя 4 минуты 48 секунд:
И код кажется ровный, без лишних сложностей и диких перекосов.
- DesignerMix
- Администратор
- Сообщения: 6719
- Зарегистрирован: 25 апр 2014, 10:51
- Откуда: Белгород
- Контактная информация:
cmd for восклицательные знаки
dyxen, Если в скрипте из этого сообщения заменить строку
' C:\Users\bla\Desktop\123\new1111.mp3 ' ,' C:\Users\bla\Desktop\123\123!\77777!.mp3 ' ,' C:\Users\bla\Desktop\123\1235554888!!!\4779987\test!.mp3 ' ,
Но, в самом конце запятая и почему-то после/перед кавычками пробелы и переда запятыми пробелы
Но уже ближе к цели
Отправлено спустя 1 минуту 44 секунды:
PS: Отметил тему решенной, спасибо что отписались
$List = $Dir | where {$_.extension -eq $FileExtension} | % {Write-Host $_.FullName}
на строку $List = $Dir | where {$_.extension -eq $FileExtension} | % {Write-Host "'"$_.FullName"'" "," -nonewline}
то получается такой вывод:' C:\Users\bla\Desktop\123\new1111.mp3 ' ,' C:\Users\bla\Desktop\123\123!\77777!.mp3 ' ,' C:\Users\bla\Desktop\123\1235554888!!!\4779987\test!.mp3 ' ,
Но, в самом конце запятая и почему-то после/перед кавычками пробелы и переда запятыми пробелы

Но уже ближе к цели
Отправлено спустя 1 минуту 44 секунды:
Круто! Поздравляю, ну а я пожалуй продолжу изучать powershell.
PS: Отметил тему решенной, спасибо что отписались
cmd for восклицательные знаки



- DesignerMix
- Администратор
- Сообщения: 6719
- Зарегистрирован: 25 апр 2014, 10:51
- Откуда: Белгород
- Контактная информация:
cmd for восклицательные знаки
я тоже
Я просто забыл и посчитал что нужно было все файлы разделять запятой... Сейчас пересмотрел скрипт и понял что не надо было.
Это легко, просто взять кавычку в кавычки: '"'
Использую VBS для подключения сетевого принтера по умолчанию, но для меня процесс написания скриптов на VBS вообще темный лес
Может в спам попадают? Почта работает, я проверил.
Если вы считаете что это не лучший ответ то можете нажать на "больше не лучший ответ" и потом выбрать новый, но в данной теме на мой взгляд правильно выбрать именно тот ответ, чтобы люди со схожей проблемой даже не читая тему сразу увидели решение.