Невозможно решить проблему на том же уровне, на котором она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.
Альберт Эйнштейн

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

Как вывести имена файлов без расширения в переменную в 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"

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