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

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

Автор: wolf0425
Дата сообщения: 18.07.2010 19:53

Цитата:
Если есть знак %, то код не работает,
наплюй, нефиг % в имена вставлять.
будешь сегодня горбатиться чтоб % обойти, завтра - & и ^ в имена воткнут

ну или перепписывай веь батник, чтоб всегда была работа в текущем каталоге, без необходимости указания путей - у тебя же пока только с путями проблема, не с именами

Автор: lorents
Дата сообщения: 18.07.2010 21:34
wolf0425

Цитата:
наплюй, нефиг % в имена вставлять.

ок, так и сделаю
Автор: Con
Дата сообщения: 19.07.2010 00:48
Подскажите пожалуйста. Достаточно тривиальная задача - закрыть все приложения запущенные с USB диска. Не могу найти подходящую утилиту (ну или сочетание утилит).
Просмотрел нирсовтовский, сисинтерналовский пакеты и стандартные windows утилиты.
Как правило ни одна из утилит не различает путь к запущенному процессу, только имя.
Единственное исключение nircmd (closeprocess, killprocess), но требует точного указания файла.

ps. я не хочу извлекать/отключать диск, ищу решение для закрытия всех процессов запущенных с определенного диска.
Автор: igor_andreev
Дата сообщения: 19.07.2010 01:55
Con
отсюда вытаскивай пути: pv -e | find "буква:\"
или отсюда: pv -o"%f" *.exe | find /i "буква:\"(в батнике знак "%" удваивать конечно)
FOR /? в помощь...
pv тут: http://www.teamcti.com/pview/prcview.htm
покилять: pv -k
Автор: mugil_cephalus
Дата сообщения: 19.07.2010 09:58
wolf0425

Цитата:
copy /? ????

а что, в англицком хелпе есть copy /# ?
Автор: wolf0425
Дата сообщения: 19.07.2010 10:11

Цитата:
а что, в англицком хелпе есть copy /#   ?
нету, а это чему-то мешает?
когда lorents повторно спросил где прочитать про copy /# - я его послал читать хэлп по ключам, тебе виделись другие варианты лечения пациента?

Автор: lorents
Дата сообщения: 19.07.2010 10:54
wolf0425

Цитата:
тебе виделись другие варианты лечения пациента?

Автор: mugil_cephalus
Дата сообщения: 19.07.2010 11:05
wolf0425

Цитата:
когда lorents повторно спросил где прочитать про copy /# - я его послал читать хэлп по ключам, тебе виделись другие варианты лечения пациента?

а я уж подумал, что ОПЯТЬ переводчики меня подвели

Добавлено:
wolf0425
тебе уж пора на роялти претендовать
Автор: garri671
Дата сообщения: 19.07.2010 11:35
Доброго времени суток!
Есть 30 файлов (txt1.txt - txt30.txt) с разным колиством строк. Стоит задача создать из них файлы с равным количеством строк (например 60 000).
Автор: wolf0425
Дата сообщения: 19.07.2010 13:12

Цитата:
Стоит задача создать из них файлы с равным количеством строк (например 60 000).
в смысле - слить вместе и порезать заново, на равные куски + хвост?

вырезать кусок с 1 по 60000 строку - sed -n -e "1,60000 p" <in >out
Автор: garri671
Дата сообщения: 19.07.2010 16:59
wolf0425

Цитата:
в смысле - слить вместе и порезать заново, на равные куски + хвост?

Совершенно верно!
Автор: Con
Дата сообщения: 19.07.2010 19:02
igor_andreev

Цитата:
отсюда вытаскивай пути: pv -e | find "буква:\"
или отсюда: pv -o"%f" *.exe | find /i "буква:\"(в батнике знак "%" удваивать конечно)
FOR /? в помощь...
pv тут: http://www.teamcti.com/pview/prcview.htm
покилять: pv -k

Спасибо, подошло. Правда сделал все проще.
pv.exe -k -l"%MY_DISK%:\*" -f
Автор: wolf0425
Дата сообщения: 19.07.2010 19:48

Цитата:
Совершенно верно!
как-то так:

Код: @echo off
rem (txt1.txt - txt30.txt)
cd . >total.txt
for /l %%i in ( 1,1,30 ) do 1>>total.txt more txt%%i.txt

set _begin=1
set _step=6
set _filen=1

:loop
call :_print new_%_filen%.txt
if errorlevel 1 goto :loop

del total.txt
goto:eof

:_print
set /a _end = %_begin% + %_step% - 1
sed -n -e "%_begin%,%_end% p" <total.txt >%1
set /a _begin += %_step%
set /a _filen += 1
if "%~z1" neq "0" exit /b 1
del %1
Exit /b 0
Автор: garri671
Дата сообщения: 21.07.2010 04:37
wolf0425
Спасибо, проверю.
Автор: res2001
Дата сообщения: 21.07.2010 08:03
garri671
посмотри еще такой вариант:

Код: @echo off
setlocal enabledelayedexpansion
set "max=10"
set "allfile=.\1\txtall.txt"
set "indir=.\1\"
set "outdir=.\2\"

del /f/q %allfile%
for /l %%a in (1;1;%max%) do >>%allfile% type %indir%txt%%a.txt & >>%allfile% echo.
set /a "count=0"
for /f "tokens=*" %%a in (%allfile%) do set /a "count+=1"
set /a "p=count/max"
set /a "p1="count-p*max"
set /a "tek=0"
for /l %%a in (1;1;%max%) do (
    if %%a leq %p1% (set /a "p2=p+1") else (set /a "p2=p")
    set /a "it=0"
    set "skp=!tek!"
    set /a "is=0"
    for /f "delims=" %%b in (%allfile%) do (
        if !is! geq !tek! call :writefile %outdir%txt%%a.txt %%b
        set /a "is+=1"
))

:writefile
if !it! lss !p2! (
    >>%1 echo.%2
    set /a "it+=1"
    set /a "tek+=1"
)
Автор: wolf0425
Дата сообщения: 21.07.2010 09:28

Цитата:
Я пробовал заюзать переменный skip - постоянно вылазила ошибка с непредвиденным появлением чего-либо (for /f "skip=%vv%" ...). Может что не так делал?
в тривиальном случае всё работает:
@echo off
set ln=5
for /f "skip=%ln% delims=" %%a in ('dir /b ') do echo %%a

там главное чтоб skip=0 не получалось, других ограничений не припомню.
а у тебя анверно оно и есть.
так что или извертываться и проверив специально в случае 0 ничего не подставлять, или вообще скип сделать через more +n

А вот насколько быстро for лопатит файл на миллион(ы) строк - вопрос интересный, у меня как-то оптимизма нет. зато фор можно делать вообще без скипа, однопроходным, меняя имя выходного файла просто по ходу.


ну и как garri671 отнесется к игнорированию пустых строк - непонятно. и стартовые пробелы точно зря выкидываешь.
Автор: res2001
Дата сообщения: 21.07.2010 09:39
wolf0425
skip=0 было конечно в первой итерации, пробовал обходить этот момент.
Протестирую еще, наверно сам где-то тупил.
Стартовые пробелы поправил.
С пустыми строками можно побороться используя findstr /n.
Ща че-нить сваяем

Добавлено:
findstr то же отбрасывает пустые строки

Добавлено:
Вот усовершенствованная версия:

Код: @echo off
setlocal enabledelayedexpansion
set "max=10"
set "allfile=.\1\txtall.txt"
set "indir=.\1\"
set "outdir=.\2\"

del /f/q %allfile%
for /l %%a in (1;1;%max%) do >>%allfile% type %indir%txt%%a.txt & >>%allfile% echo.
set /a "count=0"
for /f "delims=" %%a in (%allfile%) do set /a "count+=1"
set /a "p=count/max"
set /a "p1="count-p*max"
set /a "fn=1"
set /a "it=0"
for /f "delims=" %%b in (%allfile%) do (
    if !fn! leq %p1% (set /a "p2=p+1") else (set /a "p2=p")
    if !it! geq !p2! set /a "it=0" & set /a "fn+=1"
    >>%outdir%txt!fn!.txt echo.%%b
    set /a "it+=1"
)
Автор: wolf0425
Дата сообщения: 21.07.2010 12:25

Цитата:
findstr то же отбрасывает пустые строки
гонишь
for /f "tokens=1* delims=]" %%a in (' find /n /v "" ^<file') do echo.%%b
перед echo вписываешь счетчики и всякие условия...

наиболее непонятно - какие ограничения по символам в тех логах, если есть спецсимволы - фор сразу идет лесом.
Автор: res2001
Дата сообщения: 21.07.2010 13:20
wolf0425
спс. за подсказку, я так пытался: findstr /n /r "." - все пустые строки повыдирал

Добавлено:

Код: @echo off
setlocal enabledelayedexpansion
set "max=10"
set "allfile=.\1\txtall.txt"
set "allfile2=.\1\txtall1.txt"
set "indir=.\1\"
set "outdir=.\2\"

del /f/q %allfile%
for /l %%a in (1;1;%max%) do >>%allfile% type %indir%txt%%a.txt
find /n /v "" %allfile% >%allfile2%
set /a "count=0"
for /f "delims=" %%a in (%allfile2%) do set /a "count+=1"
set /a "p=count/max"
set /a "p1="count-p*max"
set /a "fn=1"
set /a "it=0"
for /f "tokens=1,* delims=]" %%a in (%allfile2%) do (
    if !fn! leq %p1% (set /a "p2=p+1") else (set /a "p2=p")
    if !it! geq !p2! set /a "it=0" & set /a "fn+=1"
    >>%outdir%txt!fn!.txt echo.%%b
    set /a "it+=1"
)
del /f/q %allfile%
del /f/q %allfile2%
Автор: wolf0425
Дата сообщения: 21.07.2010 14:16

Цитата:
я так пытался: findstr /n /r "." - все пустые строки повыдирал
тоже вариант, только надо было findstr /n /r ".*"
или findstr /n /r "^"

а какая польза в set /a от кавычек? я как-то вообще люблю там лишние пробелы для читаемости вписывать, благо они вроде нормально игнорируются. типа set /a var += 1
Автор: res2001
Дата сообщения: 21.07.2010 14:35
wolf0425
С регулярными выражениями у меня тяжело, практики нет.

Цитата:
какая польза в set /a от кавычек?

да так на всякий случай, чтоб ничего лишнего туда не попало.
Я последнее время все сеты с кавычками делаю, уже на автомате получается.
Автор: lorents
Дата сообщения: 21.07.2010 17:47
Какие символы не должны быть в имени файла, чтобы его понимал *.bat?
Я знаю & ^ % !
Просто хочу написать предупреждение, какие символы не использовать?
А вообще, как это можно исправить?
Автор: wolf0425
Дата сообщения: 21.07.2010 18:56

Цитата:
Я знаю & ^ % !
а ты проверь ещё '(),;+={}[]

Автор: lorents
Дата сообщения: 21.07.2010 19:10
wolf0425

Цитата:
а ты проверь ещё '(),;+={}[]

Проверил, теперь их пять символов & ^ % ! ;

Это можно исправить?
Автор: res2001
Дата сообщения: 22.07.2010 07:54
lorents

Цитата:
Это можно исправить?

Это уже к микрософту вопрос
Автор: olololishe21
Дата сообщения: 22.07.2010 08:20
Всем доброго дня уважаемые, возник вопрос, есть домен под управлением win 2k3, клиенты xp. При входе в домен запускается батник который создаёт папку с именем пользователя на сетевом диске. Собственно вопрос, можно ли сделать чтоб этот же батник создавал пользователю ярлык для этой папки на рабочем столе и называл папку не %username%, а по данным из учётки домена (например Вася Пупкин).
Автор: lorents
Дата сообщения: 22.07.2010 08:42
res2001

Цитата:
Это уже к микрософту вопрос

понял, оказалось эти символы не понимает не только bat, но и некоторые программы.
Автор: res2001
Дата сообщения: 22.07.2010 08:54
lorents

Цитата:
понял, оказалось эти символы не понимает не только bat, но и некоторые программы.

которые используют те же системные функции доступа к файлам что и cmd.
Win32 API он тааакой загадочный, там работает, там нет, там рыбу заворачивали.

Добавлено:
olololishe21

Цитата:
можно ли сделать

Можно!
Для создания ярлыка можно использовать nircmd или что-нить более специализированное.
Для запросов в AD есть встроенные средства (dsget, dsquery), но у меня нет под рукой AD, поэтому конкретней не скажу.
Автор: Melhior
Дата сообщения: 22.07.2010 13:03
господа!
что-то я никак не докумекаю, как сделать несложную вроде бы вещь
диспозиция такова.
имеется родительская папка, так сказать, оттуда будет запускаться батник. в родительской папке есть подкаталог. в нём файлы двух типов (по расширению). необходимо файлы одного типа задвоить, прибавив к имени символ. то есть были, допустим file01.txt и file02.txt, а нужно их скопировать в тот же подкаталог, но с именами file01z.txt и file01z.txt, например. символ, добавляемый к имени файла для задвоения, один для всех.
спасибо.
Автор: res2001
Дата сообщения: 22.07.2010 13:40
Melhior

Код: @echo off
for %%a in (c:\1\dir\*.txt) do copy /b /y %%a %%~dpnaz.txt

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

Предыдущая тема: XP не видит второй раздел на съемном USB-HDD


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