Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 3

Автор: 0Vovan0
Дата сообщения: 01.05.2007 05:28
Elroir
Спасибо

еще вопрос
батник запускается из папки
c:\f1\f2\name\x.bat
name неизвестно, как его получить?

и последнее - можно ли где найти полный список модификаторов переменных батников?
таких как
%~d1 замена %1 именем диска
%~p1 замена %1 путем
в ntcmds.chm не все к сожаленью
Автор: NIKZZZZ
Дата сообщения: 01.05.2007 06:18
0Vovan0

Цитата:
батник запускается из папки
c:\f1\f2\name\x.bat

Не понял, как его найти?
Например, так
dir /s /b c:\f1\f2\x.bat


Цитата:
найти полный список модификаторов переменных батников?

for /? или в ее описании.



Автор: Maza Faka
Дата сообщения: 01.05.2007 06:57
0Vovan0

Цитата:
c:\f1\f2\name\x.bat
name неизвестно, как его получить?


Ну или так:

Код:
@Echo off
For /F "Skip=1 Delims=\ Tokens=4" %%a in ('Dir /b /s C:\f1\f2') do Echo %%a
Автор: Elroir
Дата сообщения: 01.05.2007 11:51
0Vovan0

Цитата:
c:\f1\f2\name\x.bat
name неизвестно, как его получить?

Что бы получить имя родительской директории, можно воспо;ьзоваться следующим кодом:

Код:
@echo off
setlocal enabledelayedexpansion
pushd ..
call :find_dir "%cd%"
popd
echo %parent_dir%
rem В переменной parent_dir будет нужное значение
rem Отсюда и до "goto :EOF" остальной код
rem ...
rem ...
goto :EOF
:find_dir
set "parent_dir=%~nx1"
if not defined parent_dir (
set "parent_dir=%~dp1"
set "parent_dir=!parent_dir:~0,-1!"
)
Автор: Maza Faka
Дата сообщения: 01.05.2007 16:30
Elroir

Цитата:
Что делает твой код?


Я ответил так, как понял вопрос...
Автор: Elroir
Дата сообщения: 01.05.2007 16:34
Maza Faka

Цитата:
Я ответил так, как понял вопрос

Это понятно
Перефразирую вопрос - что он должен был делать?
(Я не издеваюсь - действительно не понимаю).
Автор: Maza Faka
Дата сообщения: 01.05.2007 16:42
Elroir
Вопрос был такой:

Цитата:
батник запускается из папки
c:\f1\f2\name\x.bat
name неизвестно, как его получить?

Ну я и подумал, что человеку нужно увидеть имя папки


Добавлено:
Elroir

Цитата:
Что бы получить имя родительской директории, можно воспо;ьзоваться следующим кодом:

Одно не понял в твоём коде, для чего эта строка set "parent_dir=%~nx1"
И зачем такой большой код, если можно воспльзоваться таким:

Код:
@Echo off
Pushd ..
Set CurDir=%CD%
Popd
Echo %CurDir%
Автор: Elroir
Дата сообщения: 01.05.2007 17:05
Maza Faka

Цитата:
Одно не понял в твоём коде, для чего эта строка set "parent_dir=%~nx1"
И зачем такой большой код, если можно воспльзоваться таким:

Затем, что вопрос был "как получить name", a не "как получить c:\f1\f2\name".
Вот я и вытаскиваю из полного пути c:\f1\f2\name последнюю директорию.
Если ты берешь просто %CD% - получаешь полный путь.
А код получился большим, потому что проверяется вариант, когда текущая или родительская директория - это корневая директория диска.
Автор: Maza Faka
Дата сообщения: 01.05.2007 18:04
Elroir
Всё понятно

Добавлено:
Elroir
Ещё один вариант

Код:
@Echo off
Call :MyDir %CD%
Goto :EOF
:MyDir
Set CurDir=%~nx1
If not defined CurDir (Echo This is root directory) Else (Echo %CurDir%)
Автор: Elroir
Дата сообщения: 01.05.2007 19:09
Maza Faka
Вариант чего? Проверки на корневую директорию?
Автор: glebsts
Дата сообщения: 01.05.2007 20:04
Здравствуйте,
помогите пожалуйста!
Нужно выводить имя самого большого файла для заданного каталогa и каждого из его подкаталогов.
Почитал здесь и в хелпе. Нашел сортировку файлов по размеру. Хочу родить примерно такую конструкцию (сорри за C-like комментарии):

Код: @echo off
set filepath=
FOR /F %%i IN ('dir /s /a /b /o-s %1') DO
if filepath<> //здесь путь к файлу(без имени), я так понял, что %~pI, да?
(
echo %~nI
set filepath= //опять путь к файлу
)
Автор: Elroir
Дата сообщения: 01.05.2007 21:45
glebsts

Цитата:
Как правильно оформить?

Видимо так:

Код:
@echo off
setlocal enabledelayedexpansion
if "%1"=="" (set work_dir=%cd%) else (set work_dir=%~1)
set "largest_size=0"
for /r "%work_dir%" %%a in (*.*) do (
if %%~za GTR !largest_size! (
set "largest_size=%%~za"
set "largest_file=%%a" ))
echo %largest_file%
echo %largest_size%
Автор: glebsts
Дата сообщения: 01.05.2007 21:54
ой. что-то я в /R и не вчитался толком. Спасибо большое, так оно действительно проще%)) Попробую сейчас еще и на shell-скрипт переписать, ибо на нем тоже надо. Спасибо)


УПД:
Знаете, я может слегка не так выразился, но для каждого подкаталога нужно найти свой наибольший файл. Сижу и думаю,
for /r "%sel_dir%" %%a in (*.*) do (
суть два вложенных цикла, внешний для каталогов, внутренний для файлов в каталоге из внешнего.
Как "провести границу" между циклами? т.е.

Код: for каждый каталог do(
largest_size=0
for каждый файл do (
if ..GTR largest_size (...)
)
echo largest_size
)
Автор: Elroir
Дата сообщения: 02.05.2007 00:04
glebsts
Задача действительно другая...
Вот возможное решение:

Код:
@echo off
if "%1"=="" (call :process "%cd%") else (call :process "%~f1")
goto :EOF
:process
pushd %1
for /f "tokens=*" %%i in ('dir /a-d /b /os 2^>nul') do set "current_largest=%%i"
if not "%current_largest%"=="File Not Found" echo The largest file in %1 is %current_largest%
for /f "tokens=* delims=" %%a in ('dir %1 /b /ad') do call :process "%%~fa"
popd
Автор: glebsts
Дата сообщения: 02.05.2007 00:51
Да, явно шустрее)
скажите пожалуйста, а 2^ - что такое? в синтаксисе dir такого не нашел.
Саму идею понял, очень рад) спасибо еще раз)

UPD:
кстати, там недочет - при попадании в пустой каталог выдается имя наибольшего файла предыдущего каталога)
добавил set "current_largest=No files" после pushd %1
Автор: NIKZZZZ
Дата сообщения: 02.05.2007 01:32
glebsts

Цитата:
а 2^ - что такое?

"^>" заменяет ">" , иначе он будет воспринят как перенаправление.


Автор: Elroir
Дата сообщения: 02.05.2007 01:33
glebsts

Цитата:
а 2^ - что такое? в синтаксисе dir такого не нашел

Это не относится к dir-у. Это перенаправление потока ошибок в nul. Должно выглядеть так: any_command 2>nul. ">" спец. симво; перенаправления, чтобы использовать его внутри for-a, надо добавить к нему символ "^", который позволяет for-у воспринимать его правильно. А нужна эта добавка потому, что команда "'dir /a-d /b /os' выдает в поток ошибок "File Not Found", если в проверяемой директории нет ни одного файла. Вот я и скрыл эти надписи.
Автор: 0Vovan0
Дата сообщения: 02.05.2007 03:47
Всем спасибо, что надо получил но запутали окончательно

Такой вот более вроде простой вопрос, ответ хотелось бы тоже воспринимаемый)
запустить из батника для каждого файла в папке-подпапках(т.е как с dir /b /s) какую-либо команду, имя каждого файла соотв будет параметром для этой команды.

В принципе к этому в продолжение - можно ли эту команду выполнять не по порядку листинга файлов, а выбирать случайный файл, н раз?
Автор: Elroir
Дата сообщения: 02.05.2007 04:00
glebsts

Цитата:
кстати, там недочет - при попадании в пустой каталог выдается имя наибольшего файла предыдущего каталога)

Действительно - не обратил внимание :-(
Исправленный код:

Код:
@echo off
if "%1"=="" (call :process "%cd%") else (call :process "%~f1")
goto :EOF
:process
pushd %1
set "current_largest="
for /f "tokens=*" %%i in ('dir /a-d /b /os 2^>nul') do set "current_largest=%%i"
if defined current_largest echo The largest file in %1 is %current_largest%
for /f "tokens=* delims=" %%a in ('dir %1 /b /ad') do call :process "%%~fa"
popd
Автор: Maza Faka
Дата сообщения: 02.05.2007 07:07
0Vovan0

Цитата:
запустить из батника для каждого файла в папке-подпапках(т.е как с dir /b /s) какую-либо команду, имя каждого файла соотв будет параметром для этой команды.
можно ли эту команду выполнять не по порядку листинга файлов, а выбирать случайный файл

Ну вот например так, копируется случайный файл, в зависимости от того какую цифру введёшь

Код:
@Echo off
Setlocal enabledelayedexpansion
Set /p "Select=Введите номер файла, который нужно скопировать "
Set Var=0
For /F "Tokens=*" %%a in ('Dir /b /s /a:-d') do (
Set /a Var+=1
If "!Var!"=="%Select%" copy "%%a" D:\Test)
Автор: wolf0425
Дата сообщения: 02.05.2007 09:57
0Vovan0

Цитата:
запустить из батника для каждого файла в папке-подпапках(т.е как с dir /b /s) какую-либо команду, имя каждого файла соотв будет параметром для этой команды.

for /f "delims=" %%a in ('dir /b /s /a-d') do anyprogram "%%a"


Цитата:
можно ли эту команду выполнять не по порядку листинга файлов, а выбирать случайный файл
уточни - надо выбрать и запустить программу для одного случайного файла
или надо запустить для всего списка, но в случайной последовательности?

как сортировать списки по алфавиту - все знают, а вот как наоборот, быстро сделать случайную сортировку строк списка - в голову ничего не приходит.

хотя на не очень длинных списках неплохо работает такое

Код: @echo off
enabledelayedexpansion

del tmplist.txt
for /f "delims=" %%a in ('dir /b /s /a-d *.mp3') do echo !random! %%a >>tmplist.txt
del tmplist2.txt
for /f "tokens=1*" %%a in ('sort tmplist.txt') do echo %%b >>tmplist2.txt
Автор: JohnRD
Дата сообщения: 02.05.2007 10:45
день добрый, поправьте пожалуйста где я ошибаюсь
есть два списка, нужно из первого выбрать правую часть если ее левая часть есть во втором списке
users4.txt

Код: Belov_TA;Белов Тимур Анатольевич
Belov_VA;Белов Владимир Алексеевич
Belov_VI;Белов Виктор Иванович
Belova_EA;Белова Екатерина Анатольевна
Belova_EB;Белова Елена Борисовна
Belova_GA;Белова Галина Алексеевна
Автор: wolf0425
Дата сообщения: 02.05.2007 11:02
JohnRD

Цитата:
поправьте пожалуйста где я ошибаюсь

в твоем варианте не хватает enabledelayedexpansion в начале батника
и соответственно вместо %name% в цикле надо было писать !name!

но ведь без промежуточных переменных ничуть не хуже

Цитата:
нужно из первого выбрать правую часть если ее левая часть есть во втором списке


Код:
@echo off
for /f "tokens=1,2* delims=;" %%a in (users4.txt) do find "%%a" users5.txt > nul && echo %%b >> new2.txt
Автор: JohnRD
Дата сообщения: 02.05.2007 11:38
wolf0425 слов нет, просто классно
спасибо
Автор: yurkesha
Дата сообщения: 02.05.2007 11:44

Цитата:
@echo off
for /f "tokens=1,2* delims=;" %%a in (users4.txt) do find "%%a" users5.txt > nul && echo %%b >> new2.txt

я бы все таки советовал поменять на
Код: for /f "tokens=1* delims=;" %%a in (users4.txt) do find "%%a" users5.txt > nul && echo %%b >> new2.txt
Автор: wolf0425
Дата сообщения: 02.05.2007 12:05
yurkesha
Цитата:
я бы все таки советовал поменять на
угу, ты можешь быть и прав - в зависимости от того что в действительности нужноJohnRD для случая строки вида
Belov_TA;Белов Тимур Анатольевич;сотрудник
чтобы в new2.txt вставилось только ФИО, как в оригинальном варианте, или вся оставшаяся строка - как в твоем.

Автор: JohnRD
Дата сообщения: 02.05.2007 12:19
wolf0425
подскажите как убрать ковычки

"Barsukov_DA;Барсуков Дмитрий Алексеевич"
"Bartish_YV;Бартиш Ян Владимирович"
"Bashashnin_MV;Башашнин Максим Владимирович"
"Bashkankov_AP;Башканков Александр Павлович"
"Basov_VP;Басов Валерий Павлович"
"Batashova_AG;Баташова Анна Григорьевна"
Автор: wolf0425
Дата сообщения: 02.05.2007 12:24
JohnRD

Цитата:
подскажите как убрать ковычки

for /f "delims=" %%a in (users6.txt) do echo %%~a >> new6.txt

Хотя возникают проблемы с пробелами в конце строк
Автор: JohnRD
Дата сообщения: 02.05.2007 12:35
wolf0425 спасибо большое

yurkesha
Вы правы tokens=1*
как раз столкнулся с такой проблемой
получил одни фамилии без всего остального
Автор: GORA2
Дата сообщения: 02.05.2007 13:34
Подскажите, уважаемые:
1 Можно ли ускорить выполнение нижеследующего файла?
2 Почему обрабатываются значения parC=0, хотя вроде не должны ?

Код: @echo off
::Поиск оптимальных параметров сжатия файла 7ZSD_LZMA_original.sfx утилитой Upack
::Утилита Upack выводит 15 строк информации в 14-й строке 5-й элемент является размером после упаковки
::Диапазон изменяемых параметров: parF=273...5; parC=6...0
set min_size=80000
set /a parF=273
:Loop
set /a parC=6
:Loop1
FOR /F "eol= skip=14 tokens=5" %%i in ('Upack 7ZSD_LZMA_original.sfx -test -rai -red -c%parC% -f%parF%') do set size=%%i & goto _outfor
:_outfor
if %size% LSS %min_size% set min_size=%size%
echo %parF%,%parC% - %min_size%
set /a parC-=1& IF %parC% GTR 0 GOTO Loop1
set /a parF-=1& IF %parF% GTR 5 GOTO Loop
pause>nul

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

Предыдущая тема: Автозагрузка терминальной сессии


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.