Классика – то, что каждый считает нужным прочесть и никто не читает.
Марк Твен

Меню навигации для мобильных

Как вывести имена файлов без расширения в переменную в bat файле windows?

Автор Shaman, 17 Нояб., 2023, 00:24

« предыдущая - следующая »

Shaman

Прошу помощи. Я не силён в bat файлах и мне нуже аналог вот этой команды под винду.
libray_name=$(basename -s .kicad_sym Libray/*.kicad_sym| sed.exe -e ":a" -e "$!N" -e "$!ba" -e "s/\n/\",\"/g" -e "s/^/\"/g" -e "s/$/\"/g")
Вывод команды идет в переменную libray_name и имеет вид:
"Transistor","Capacitors","Diode_UGO","Fuses","Inductance","Logic","MCU_ATMEGA","MCU_ST","Nagruzka","Optocoupler","Quartz","Resistance","Thyristors"


Пока я сваял вот так, но поскольку пример частично из интернета я не полностью понимаю принцип его работы.
@echo off
::SetLocal EnableDelayedExpansion

for %%a in ("Libray\*.kicad_sym") do  sed.exe  -e ":a" -e "$!N" -e "$!ba" -e "s/ \n/\",\"/g" -e "s/^/\"/g" -e "s/ $/\"/g" 1.txt  > 3.txt

pause
Вот исходный вариант:
@echo off
::SetLocal EnableDelayedExpansion
for %%a in ("Libray\*.kicad_sym") do echo.%%~na

pause

Вопросы поработе батника.
1. Что делает вот эта строка SetLocal EnableDelayedExpansion? Если её включить батник зависает на исполнении команды sed. До неё срабатывает хорошо.
Всё что я понимаю из второй строчки это то что for это цикл и его результаты выводятся в echo
2. Что это и как оно работает в контексте %%a и %%~na?
3. do означает передачу выхода другой команте ?
4. Как циклу передаётся, что нужно удалить именно расширение .kicad_sym? В комаде basename это задаётся через параметр -s.
5. Почему для срабатывания команды в батнике нужно ставить двойной %, а напрямую в терминале одинарный?
6. Как сделать вывод в переменную а не в файл
7. Откуда берутся пробелы в выводе цикла? Поясняю команда basename имеет вот такой вывод:
Capacitors\n
Diode_UGO\n
Fuses\n
Inductance\n
Logic\n
MCU_ATMEGA\n
MCU_ST\n
Nagruzka\n
Optocoupler\n
Quartz\n
Resistance\n
Thyristors\n
Transistor\n

А разбираемая команда:
Capacitors \n
Diode_UGO \n
Fuses \n
Inductance \n
Logic \n
MCU_ATMEGA \n
MCU_ST \n
Nagruzka \n
Optocoupler \n
Quartz \n
Resistance \n
Thyristors \n
Transistor \n
Буду благодарен за любую помощь.

P.S.
Утилита sed отсутствует в Windows по умолчанию, но имеет порт. https://github.com/mbuilov/sed-windows
Если понадобиться потестить прикрепил в аттачах.

Slabovik

В переменной в батниках вообще переводы строк непонятно как делать. Не выходят.
В файл вывести

dir /b "путь/шаблон"> filelist.txt

в каждой строчке один файл, но есть засада - он с расширением.

Сейчас повозился со всякими set и %%x и понял, что ничего не понял. %%x никак не хочет передаваться в set, а идёт сразу на экран. Можно конечно уподобиться, сделав вот такое
@Echo off
setlocal
set LO= DA и всякая фигня, т.к. в цикле оно меняться не желает, можете проверить, раскомментарив
::@echo.%LO%
for %%z in ("*.pdf") do (set /p LO = %%~nz<nul
@echo.)
::@echo.%LO%
endlocal
Если надо добавить кавычки, то получится так
@Echo off
setlocal
set LO= DA и всякая фигня, т.к. в цикле оно меняться не желает, можете проверить, раскомментарив
::@echo.%LO%
for %%z in ("*.pdf") do (set /p LO = ""%%~nz""<nul
@echo.)
::@echo.%LO%
endlocal
Если надо в одну строку, но эхо в цикле надо убрать, получится так
@Echo off
setlocal
set LO= DA и всякая фигня, т.к. в цикле оно меняться не желает, можете проверить, раскомментарив
::@echo.%LO%
for %%z in ("*.pdf") do set /p LO = ""%%~nz""<nul
::@echo.%LO%
endlocal
Совершенно всрато... Вот вообще не въеду, как вставить запятую прямо здесь.
Да, перенаправить в файл легко. Это пусть будет Lister.bat
Вызываем

Lister.bat > Liblist.txt

результат будет в Liblist.txt

Для получения требуемого вида списка надо в получившемся файле сделать замену "" на ","
SED поди справится за один проход, но в принципе, вроде тоже с батником поколодовать можно...

Да, setlocal надо использовать, потому что иначе, сделав SET чему либо, это "что либо" останется в командном процессоре до выключения системы. Что до delayedvariableexpansions, то я эту штуку не понял...
Может здесь
https://renenyffenegger.ch/notes/Windows/dirs/Windows/System32/cmd_exe/commands/setlocal/index
https://ss64.com/nt/delayedexpansion.html

ps. А вообще вот взял сразу строчку у тебя первую, и просто подставил dir /b

dir /b Libray/*.kicad_sym|sed.exe -e ":a" -e "$!N" -e "$!ba" -e "s/\n/\",\"/g" -e "s/^/\"/g" -e "s/$/\"/g"

Только я на других файлах тренировался, вроде ровно то же самое...
Общением на форуме подпитываю свою эгоистичную, склонную к самолюбованию сущность.