Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] как бы скопировать прямо из потока?

Ответить
Настройки темы
CMD/BAT - [решено] как бы скопировать прямо из потока?

Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


Задача такая. Есть туча файлов в одной директории (много тысяч и каждый день добавляются), они вперемешку, потому что разные названия, но в каждом названии есть дата.
Файлы могут иметь разные даты создания/модификации по сравнению с той датой, что вбита в название каждого из них (это ещё один сюрприз, поэтому не получится просто отсортировать в Проводнике и смотреть в конец списка). Отлавливаю список всех, подгруженных в нужную дату примерно так:
Код: Выделить весь код
dir /b /o:d|findstr /b /i %DID% |findstr %sdate%
, где DID - ещё один идентификатор, а sdate - соответствующая форма даты. В результате получается просто список нужных файлов. Которые затем хочется скопировать куда-нибудь в другую директорию, и уже там с ними работать. Потому что даже PgUp - PgDown в той огромной директории нажимать устанешь, не то что мышкой пытаться что-то выловить. Насколько показывает help, команды copy и xcopy не имеют возможностей копировать с консоли, из файла или принимая source как вывод другой команды, переданной через пайплайн. Поэтому конструкции типа
Код: Выделить весь код
C:\tmp\0>dir /b|findstr 45|copy * c:\
по ходу будут копировать именно * (т.е. всё как есть из этой директории), а хочется скопировать именно тот список файлов, который был получен после тщательного отбора командой выше. Во всяких юникс-шеллах есть возможность брать информацию прямо из консоли, это обозначается дефисом "-". Но в CMD такая штука не работает. А с командой FOR не очень понятно, потому что она не работает со вложенными пайплайнами, только не с перенаправляемыми командами.

Отправлено: 17:07, 07-05-2009

 


Moderator


Сообщения: 53449
Благодарности: 15499

Профиль | Отправить PM | Цитировать


Цитата Gennie:
dir /b /o:d|findstr /b /i %DID% |findstr %sdate%
Можно ведь проще:
Код: Выделить весь код
dir /b %DID%*%sdate%*
А копирование:
Код: Выделить весь код
copy /y %DID%*%sdate%* путь_к_папке
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:09, 07-05-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Примерный код пакетного файла может выглядеть наподобие:
читать дальше »
(за отсутствием исходных данных я был вынужден взять папку «%systemroot%\system32» и произвольные значения переменных окружения «DID»/«sdate», дабы была возможность воспроизвести результат работы пакетного файла).

Код: Выделить весь код
@echo off
setlocal enabledelayedexpansion

set DID=nt
set sdate=4

pushd "%systemroot%\system32"

for /f %%i in ('dir /b /o:d ^|findstr /b /i %DID% ^|findstr %sdate%') do (
    copy /y "%%i" "C:\Temp\%%i"
)

popd

endlocal
exit /b 0
Gennie, если переменные окружения «DID»/«sdate» содержат «запрещённые» символы, то, возможно, их также потребуется экранировать посредством «^».
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:12, 07-05-2009 | #3


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, интересный код, завтра попробую сделать оба предложения, но у меня сомнения. Как я говорил, раньше пробовал сделать в цикле FOR пайплайн, и это не получалось, если убирал пайплайн -- всё работало. Кажется, что FOR почему-то не осиливает перенаправление вывода команд внутри себя, не знаю почему. Винда 2К, пропатченная от работы (но на cmd это вроде никак не должно влиять).

Отправлено: 23:44, 07-05-2009 | #4


Старожил


Сообщения: 440
Благодарности: 12

Профиль | Отправить PM | Цитировать


Gennie, потоки точно работают внутри цикла. Вы вероятно просто писали | вместо ^| . Внутри цикла нужно экранировать символ | иначе интерпретатор будет думать, что это просто строка с перенаправлением и ничего работать не будет.
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:11, 08-05-2009 | #5


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Отправить PM | Цитировать


О, спасибо большое! Да, я действительно не ставил экранов перед символом |.
То, что нужно, получилось с первого совета (copy с нужными параметрами), но интересно будет попробовать и более сложный вариант, для самообразования. Не успел ещё.

Отправлено: 21:39, 11-05-2009 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] как бы скопировать прямо из потока?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Первая строчка переменной. Как скопировать? r35TnX AutoIt 5 06-03-2009 07:12
[решено] Как скопировать фрагмент текста из файла PDF Antonij Хочу все знать 12 04-02-2009 06:49
[решено] error: 800b0100 - прямо на 39-й минуте RenZo-2007 Автоматическая установка Windows 2000/XP/2003 10 04-04-2008 21:11
[решено] Как скопировать текст из окна DOC. Ser6720 Хочу все знать 4 16-01-2008 08:31




 
Переход