cmd for восклицательные знаки ✓ ЕСТЬ ОТВЕТ

Любые вопросы касающиеся ОС Windows и Linux

Модератор: Tim308

Ответить
Аватара пользователя

Автор темы
dyxen
Постоянный пользователь
Сообщения: 60
Зарегистрирован: 25 мар 2018, 18:01
Есть ответ: 1
Репутация: 3
Статус: Не в сети

cmd for восклицательные знаки

#1

Сообщение dyxen » 10 апр 2018, 23:08

Нужно сделать cmd скрипт который в определенной папке искал все файлы и определенным образом обрабатывал ВКЛЮЧАЯ файлы-папки с восклицательными знаками.

Например такой код

Код: Выделить всё

@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

например у меня в папке "d:\dir1"
3 файла ".mp3"

muz1.mp3
muz2.mp3
muz3_!.mp3

"muz3_!.mp3" отображается "muz3_.mp3" (без восклицательного знака).
И соответственно файл не правильно обрабатывается.

Подобное было и с папками.

Если есть знающие, подскажите пожлста, есть ли какой-то оптимальный способ, чтобы корректно это все работало?
PS:
Мне нумерация тоже нужна.

Я мало знаю об cmd хоть и давно уже пишу простейшие скрипты, напишите подробнее об основных моментах, и простым языком.

В гугле искал, но что-то как-то не совсем то, вот несколько в общем полезных ссылок
http://rsdn.org/article/winshell/NTComm ... .xml#EW2AE
http://forum.script-coding.com/viewtopic.php?id=5141
http://forum.oszone.net/post-2519621.html
http://www.cyberforum.ru/cmd-bat/thread1543092.html

В этом cmd команды простые но загвоздок уйма...

ЛУЧШИЙ ОТВЕТ dyxen » 13 апр 2018, 08:33
ЕСТЬ РЕШЕНИЕ!

Хм.
Мне на форуме дали скорректированный код на 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
Администратор
Администратор
Сообщения: 5618
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 195
Репутация: 649
Откуда: Белгород
Контактная информация:
Статус: Не в сети

cmd for восклицательные знаки

#2

Сообщение DesignerMix » 11 апр 2018, 00:52

Если убрать setlocal EnableDelayedExpansion и заменить !! На %% то в именах файлов появятся восклицательные знаки, но пропадает нумерация (всегда 0 в переменной num) и в list отображается только последний файл...

Блин, завтра еще голову поломаю, сегодня уже спать пора.

Аватара пользователя

Автор темы
dyxen
Постоянный пользователь
Сообщения: 60
Зарегистрирован: 25 мар 2018, 18:01
Есть ответ: 1
Репутация: 3
Статус: Не в сети

cmd for восклицательные знаки

#3

Сообщение dyxen » 11 апр 2018, 13:51

Я не в первый раз, не первый день вожусь с этим "!". Давно вожусь... Ситуация (точнее синтаксис языка cmd + "!") хуже чем кажется на первый взгляд. Я пробовал и for с вложенным "dir /b" (dir показывает файлы в папке/ах), ну что-то типо

Код: Выделить всё

for /f "usebackq delims= tokens=*" %%R in (
`dir "%dir1%\*.mp3" /b`
) do (
...
)
но пока безрезультатно

Где-то ещё писали заменить "!" на переменную
set w=!
но это применимо если вручную указывать имя файла/папки

Пробовал варианты
^!
^^!
^^^!
...
безрезультатно

"for" упорно не хочет видеть что "!" это часть имени а не команда

Из-за мелочи полезная команда сводится к минимуму

Аватара пользователя

DesignerMix
Администратор
Администратор
Сообщения: 5618
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 195
Репутация: 649
Откуда: Белгород
Контактная информация:
Статус: Не в сети

cmd for восклицательные знаки

#4

Сообщение DesignerMix » 11 апр 2018, 23:17

dyxen, пока безрезультатно. Я всего пару раз писал такие скрипты... Надо читать мануалы. Если что получится напишу.

Отправлено спустя 45 минут 19 секунд:
И еще - я правильно понимаю что вам нужно сформировать список файлов (каждый файл в кавычках и с полным путем включая расширение) в папке и вложенных папках и потом передать этот спискок для формирования плейлиста в aimp?

Если это все что вам нужно и если это то, ради чего в принципе пишется скрипт то может проще будет средствами самого aimp'а это сделать. Скажите подходит-ли вам такой вариант и я попробую себе поставить AIMP и потестировать, я уверен что там такое можно сделать.

Аватара пользователя

Автор темы
dyxen
Постоянный пользователь
Сообщения: 60
Зарегистрирован: 25 мар 2018, 18:01
Есть ответ: 1
Репутация: 3
Статус: Не в сети

cmd for восклицательные знаки

#5

Сообщение dyxen » 12 апр 2018, 00:39

DesignerMix

скрипт который я привёл в 1 посте - основная схема которая я хотел бы знать,
как работает, так, как она вообще, так сказать, "по задумке", должна работать.
- это основная идея, цель, с которой я создал эту тему.

В данной ситуации это не "жизненно-важная проблема", я хотел бы просто знать это, надо было сразу жирно написать, "вопрос коварный, если не программист CMD со стажем - лучше и не пытайся решить".

Я, мне удалось прийти к решению (ну, ещё в 1-2 раз когда с этим "!" столкнулся):
* отключить "setlocal EnableDelayedExpansion"
* использовать только "%" и обрабатывать файлы по одному
тогда всё работает как надо и "!" распознаётся нормально.

Я это написал по принципу "а вдруг...".
Будут идеи - напиши/те, нет - ладно, переживу...

Мне вообще всё больше думается что эта схема (код в 1 посте) вообще не решаема, хотя я и видел где-то человек писал что он сумел правильно обрабатывать вообще все спец-символы в своих cmd-файлах.

Мне нужно чтобы при любых операциях при использовании for и "setlocal EnableDelayedExpansion" знаки "!" в именах файлов обрабатывались прпавильно.
Мне не обязательно именно для AIMP, хоть .txt для блокнота...
Списки файлов заключённые в кавычки с полными путями нужны обязательно, не то чтоб сильно горело, но в рамках данной темы они актуальны (про имена и расширения "%~nR" "%~xR" "%~nxR" итп в команде for я разобрался).
И конечно очень хочется добавлять нумерацию "по желанию, где хочу", а не только где надо, но это второстепенно.

Чувствую придётся для обработки списка файлов учить другой язык :( .

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

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

Аватара пользователя

DesignerMix
Администратор
Администратор
Сообщения: 5618
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 195
Репутация: 649
Откуда: Белгород
Контактная информация:
Статус: Не в сети

cmd for восклицательные знаки

#6

Сообщение DesignerMix » 12 апр 2018, 08:26

dyxen писал(а):
12 апр 2018, 00:39
Ну и на крайняк если знаете похожий язык, не очень сложный но достаточный для элементарных простых операций подскажите
powershell

Аватара пользователя

Автор темы
dyxen
Постоянный пользователь
Сообщения: 60
Зарегистрирован: 25 мар 2018, 18:01
Есть ответ: 1
Репутация: 3
Статус: Не в сети

cmd for восклицательные знаки

#7

Сообщение dyxen » 12 апр 2018, 19:00

Посмотрел powershell. Ух что-то непростая она, поискал самые простые операции: вывод сообщения (по аналогии в cmd - echo), приостановка в конце .ps1 файла... что-то как-то не очень получается, даже приостановку в конце не получилось сделать, правда я ей (powershell) вообще не занимался, может со временем это всё будет проще, но пока не очень... и до работы с аналогом "for" (в cmd) наверно мне далеко...

Отправлено спустя 2 минуты 41 секунду:
но да ладно, мне желательно чтобы командный файл можно было запускать с флешки на любом компе, желательно без установки в систему допрлнительных компонентов, может чего ещё найду...

Аватара пользователя

DesignerMix
Администратор
Администратор
Сообщения: 5618
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 195
Репутация: 649
Откуда: Белгород
Контактная информация:
Статус: Не в сети

cmd for восклицательные знаки

#8

Сообщение DesignerMix » 12 апр 2018, 19:20

dyxen, на семерке и выше powershell есть в системе, правда в некоторых случаях он просто отключен (нужно включать в компонентах Windows). Нашел ПО где можно скрипты на PS визуально делать, если получится решить там вашу задачу то отпишусь.

Аватара пользователя

Автор темы
dyxen
Постоянный пользователь
Сообщения: 60
Зарегистрирован: 25 мар 2018, 18:01
Есть ответ: 1
Репутация: 3
Статус: Не в сети

cmd for восклицательные знаки

#9

Сообщение dyxen » 12 апр 2018, 20:23

DesignerMix писал(а):
12 апр 2018, 19:20
на семерке и выше powershell есть в системе
у меня и своя сейчас Win XP и везде часто Win XP

Отправлено спустя 1 минуту 3 секунды:
устанавливал отдельно на Win XP

Аватара пользователя

DesignerMix
Администратор
Администратор
Сообщения: 5618
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 195
Репутация: 649
Откуда: Белгород
Контактная информация:
Статус: Не в сети

cmd for восклицательные знаки

#10

Сообщение DesignerMix » 12 апр 2018, 20:45

dyxen, понятно. Ну тогда я в вашем вопросе бесполезен. Удаляюсь

Аватара пользователя

Автор темы
dyxen
Постоянный пользователь
Сообщения: 60
Зарегистрирован: 25 мар 2018, 18:01
Есть ответ: 1
Репутация: 3
Статус: Не в сети

cmd for восклицательные знаки

#11

Сообщение dyxen » 12 апр 2018, 21:14

DesignerMix писал(а):
12 апр 2018, 20:45
Ну тогда я в вашем вопросе бесполезен. Удаляюсь
если это потому что XP то нет, на XP powershell работает без проблем, просто её нужно устанавливать отдельно.

Ну, это надо у программистов спрашивать, я где-нибудь ещё спрошу, найду ответ отпишусь
(ну не обязательно именно в cmd, может отдельной портативной утилитой...)

Аватара пользователя

DesignerMix
Администратор
Администратор
Сообщения: 5618
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 195
Репутация: 649
Откуда: Белгород
Контактная информация:
Статус: Не в сети

cmd for восклицательные знаки

#12

Сообщение DesignerMix » 12 апр 2018, 21:55

dyxen писал(а):
12 апр 2018, 21:14
на XP powershell работает без проблем, просто её нужно устанавливать отдельно.
Я то знаю, но вы писали: мне желательно чтобы командный файл можно было запускать с флешки на любом компе, желательно без установки в систему допрлнительных компонентов ... у меня и своя сейчас Win XP и везде часто Win XP.

Так что работа с powershell похоже вас не устроит т.к. нужно будет устанавливать что-то дополнительно (если система будет XP там где вы захотите впервые запустить скрипт)

Аватара пользователя

Автор темы
dyxen
Постоянный пользователь
Сообщения: 60
Зарегистрирован: 25 мар 2018, 18:01
Есть ответ: 1
Репутация: 3
Статус: Не в сети

cmd for восклицательные знаки

#13

Сообщение dyxen » 12 апр 2018, 22:16

DesignerMix, если есть интересные идеи на powershell напишите пжлста :thinking: , ну если не точно то "около" той схемы, задачи которую я запросил в 1 посте.
во 1-х со многими системами XP я работаю постоянно, во 2-х если дело стоящее то установлю powershell (благо есть /quiet),
по всему видно он мощнее, может чего получше получится...

Аватара пользователя

DesignerMix
Администратор
Администратор
Сообщения: 5618
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 195
Репутация: 649
Откуда: Белгород
Контактная информация:
Статус: Не в сети

cmd for восклицательные знаки

#14

Сообщение DesignerMix » 12 апр 2018, 23:07

Вот такой скрипт ищет файлы в папке (+подпапках этой папки) и по маске расширения передаваемым в качестве параметров запуска этого скрипта.

Запускать скрипт вот так:
Находясь в директории со скриптом выполнить: .\имя_скрипта.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 
    } 
}
Понимаю что это в чистом виде не то что вам нужно, но это самое похожее что я смог найти.

Вот так выглядит результат выполнения скрипта:
PowerShellTest.PNG

Аватара пользователя

Автор темы
dyxen
Постоянный пользователь
Сообщения: 60
Зарегистрирован: 25 мар 2018, 18:01
Есть ответ: 1
Репутация: 3
Статус: Не в сети

cmd for восклицательные знаки

#15

Сообщение dyxen » 13 апр 2018, 02:43

Я создал cmd файл в директории .ps1 - файла, запустил его с указанными параметрами и... открылся блокнот.
Создал 2-й .ps1 файл написал там
DesignerMix писал(а):
12 апр 2018, 23:08
.\имя_скрипта.ps1 -FolderPath 'E:\путь\до\папки' -FileExtension '.расширение'
ПКМ по файлу - выполнить в powershell - промелькнуло окошко, закрылось и всё :) , стыдоба, как приостановить его в конце?
И ещё
как .ps1 открывать в powershell а не в БЛОКНОТе?
:D
Мама, где моя таблица умножения и букварь?
Отправлено спустя 1 час 56 минут 57 секунд:
Я тут на одном форуме спросил, мне подсказали интересную вещь
подкоррктировав свой код получилось при сохранении "!" сдлать рабочую нумерацию, но в вид списка пока не работает

Код: Выделить всё

@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
здесь даже aimp и .mp3 файлы не обязательны (в смысле для примера, при желании можно и их прикрутить)

Отправлено спустя 31 минуту 54 секунды:
К.хе, сумел наконец запустить .ps1 - файл (через саму консоль powershell, я привык 2х-клиом на ".cmd" ".ps1" файлах). Результат такой же как на приведенном выше скриншоте.

Ну, тут остаётся, кажется:
[*] заключить все строки в кавычки
[*] сделать в виде списка (убрать "перенос строк" в конце)
[*] и узнать как запустить какое либо приложение с параметрами - этим самым полученным списком.

Отправлено спустя 5 минут 52 секунды:
на заметку
если кто не знал
в cmd можно создать список файлов "столбцом" (с переносами строк)

пример "только имена файлов"

Код: Выделить всё

for /r "d:\dir1" %%R in (
*.mp3
) do (
echo "%%~nxR"
)

пример "с полными путями"

Код: Выделить всё

for /r "d:\dir1" %%R in (
*.mp3
) do (
echo "%%~fR"
)

но вот сделать их в виде непрерывной строки в cmd это задааача...
а вот в "усложнённом" powershell это может оказаться проще

Аватара пользователя

DesignerMix
Администратор
Администратор
Сообщения: 5618
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 195
Репутация: 649
Откуда: Белгород
Контактная информация:
Статус: Не в сети

cmd for восклицательные знаки

#16

Сообщение DesignerMix » 13 апр 2018, 08:16

dyxen писал(а):
13 апр 2018, 03:20
подкоррктировав свой код получилось при сохранении "!" сдлать рабочую нумерацию, но в вид списка пока не работает
)) я также пробовал, но в цикле как только endlocal то он "забывает" list. Но вот задать Var1 я не додумался и нумерация у меня тоже не работала как надо.
dyxen писал(а):
13 апр 2018, 03:20
Ну, тут остаётся, кажется:
[*] заключить все строки в кавычки
[*] сделать в виде списка (убрать "перенос строк" в конце)
[*] и узнать как запустить какое либо приложение с параметрами - этим самым полученным списком.
Понимаю, но с чего-то надо было начать. Буду пробовать сделать остальное.
dyxen писал(а):
13 апр 2018, 03:20
но вот сделать их в виде непрерывной строки в cmd это задааача...
а вот в "усложнённом" powershell это может оказаться проще.
На это и надеюсь, а так понятно что в cmd можно вывести имена, было-бы удивительно если этого сделать было нельзя.

Аватара пользователя

Автор темы
dyxen
Постоянный пользователь
Сообщения: 60
Зарегистрирован: 25 мар 2018, 18:01
Есть ответ: 1
Репутация: 3
Статус: Не в сети

cmd for восклицательные знаки

#17

Сообщение dyxen » 13 апр 2018, 08:33

ЕСТЬ РЕШЕНИЕ!

Хм.
Мне на форуме дали скорректированный код на 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
Администратор
Администратор
Сообщения: 5618
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 195
Репутация: 649
Откуда: Белгород
Контактная информация:
Статус: Не в сети

cmd for восклицательные знаки

#18

Сообщение DesignerMix » 13 апр 2018, 10:29

dyxen, Если в скрипте из этого сообщения заменить строку $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 ' ,

Но, в самом конце запятая и почему-то после/перед кавычками пробелы и переда запятыми пробелы :thinking:
Но уже ближе к цели

Отправлено спустя 1 минуту 44 секунды:
dyxen писал(а):
13 апр 2018, 08:33
ЕСТЬ РЕШЕНИЕ!
Круто! Поздравляю, ну а я пожалуй продолжу изучать powershell.

PS: Отметил тему решенной, спасибо что отписались

Аватара пользователя

Автор темы
dyxen
Постоянный пользователь
Сообщения: 60
Зарегистрирован: 25 мар 2018, 18:01
Есть ответ: 1
Репутация: 3
Статус: Не в сети

cmd for восклицательные знаки

#19

Сообщение dyxen » 13 апр 2018, 20:44

просто текст
Не знал что в cmd есть бывают подпрограммы.
В powershell
маленькая мелочь пока получилась, в той же строке убрать получится

Код: Выделить всё

$List = $Dir | where {$_.extension -eq $FileExtension} | % {Write-Host "'"$_.FullName"'" -nonewline}
запятая в конце исчезнет.
А вот ' заменить на " не получается, в смд его можно просто экранировать в повершелл думается мне что-то подобное должно быть.

А пробелы кажется обычно пропускаются (не только в смд)
PS
Кстати "Windows Script Host" тоже мощный, VBScript например. Если не смотрел рекомендую посмотреть его возможности, у него ещё и графический вывод есть (не консольное, а как у обычных .exe - окошки).

чтото у меня уведомления этой темы на емайл не приходят, хотя на тему подписан...

У "лучшего ответа" что означает "больше не лучший ответ"?

Аватара пользователя

DesignerMix
Администратор
Администратор
Сообщения: 5618
Зарегистрирован: 25 апр 2014, 10:51
Есть ответ: 195
Репутация: 649
Откуда: Белгород
Контактная информация:
Статус: Не в сети

cmd for восклицательные знаки

#20

Сообщение DesignerMix » 13 апр 2018, 22:26

dyxen писал(а):
13 апр 2018, 20:44
Не знал что в cmd есть бывают подпрограммы.
я тоже
dyxen писал(а):
13 апр 2018, 20:44
запятая в конце исчезнет.
Я просто забыл и посчитал что нужно было все файлы разделять запятой... Сейчас пересмотрел скрипт и понял что не надо было.
dyxen писал(а):
13 апр 2018, 20:44
А вот ' заменить на " не получается, в смд его можно просто экранировать
Это легко, просто взять кавычку в кавычки: '"'
dyxen писал(а):
13 апр 2018, 20:44
Кстати "Windows Script Host" тоже мощный, VBScript например. Если не смотрел рекомендую посмотреть его возможности, у него ещё и графический вывод есть (не консольное, а как у обычных .exe - окошки).
Использую VBS для подключения сетевого принтера по умолчанию, но для меня процесс написания скриптов на VBS вообще темный лес
dyxen писал(а):
13 апр 2018, 20:44
чтото у меня уведомления этой темы на емайл не приходят, хотя на тему подписан...
Может в спам попадают? Почта работает, я проверил.
dyxen писал(а):
13 апр 2018, 20:44
У "лучшего ответа" что означает "больше не лучший ответ"?
Если вы считаете что это не лучший ответ то можете нажать на "больше не лучший ответ" и потом выбрать новый, но в данной теме на мой взгляд правильно выбрать именно тот ответ, чтобы люди со схожей проблемой даже не читая тему сразу увидели решение.

Ответить

Вернуться в «Операционные системы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость