<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; CMD/BAT: Скрипт для массового копирования файлов]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=8271</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=8271&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: Скрипт для массового копирования файлов».]]></description>
		<lastBuildDate>Thu, 02 May 2013 21:39:07 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD/BAT: Скрипт для массового копирования файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=71829#p71829</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Это явно перебор wink, там лишь пара исправлений.</p></blockquote></div><p>Почему нет? Я вот, например, как-то не сообразил, что можно танцевать и от обратного — получать partial date от «.CreationTime», и начало/конец интервала уже попросту не понадобится получать.</p><div class="quotebox"><blockquote><p>Использование &quot;inline dotNet&quot; - это, конечно, фича, но не вижу смысла использовать её везде, где только можно. Логично предположить - там где &quot;стандартное&quot; решение невозможно и нет альтернатив, или стандартное решение и/или альтернативы &quot;убоги&quot; для данной задачи.</p></blockquote></div><p>Беда в том, что идея привязки PowerShell&#039;а к .Net привела к возможности существования более чем единственного варианта решения. Плюс отвратительно организованная справка (я не знаю, как обстоят дела в третьей версии, но в предыдущих — просто ужас).</p><div class="quotebox"><blockquote><p>Быть &quot;универсалом&quot; страшная вешь - несмотря на горы знаний, &quot;большим&quot; специалистом всё равно не стать, посему лучше избрать свою, довольно узкую стезю и работать в её пределах, отвлекаясь лишь на поверхностное изучение как смежных, так и далёких областей. sad</p></blockquote></div><p>Это не от тебя зависит: если работа требует узкой специализации — будешь узким специалом, если работа требует Александра Матросова — будешь и им. У варианта узкого специалиста есть один большой минус — помните, да? «Его полнота односторонняя». Учитывая то, что в настоящее время в нашей отрасли не найти несвязанных между собой технологий — лучше быть универсалом со специализацией в каких-то приоритетных областях.</p><div class="quotebox"><blockquote><p>К примеру, у меня стойкая антипатия к *Basic*, потому что &quot;он, по обыкновению, нигде, никому не нужен&quot; (личная &quot;фобия&quot; wink, хотя как язык для обучения, наверное, один из самых лучших).</p></blockquote></div><p>Напрасно. Являясь одним из наиболее популярных встраиваемых прикладных языков программирования, Basic даёт наибольший охват продуктов. Для обучения же, на мой непросвещённый взгляд, лучше пользовать стандартный Паскаль.</p><div class="quotebox"><blockquote><p>Качество и т.н. &quot;нужность/необходимость&quot; кода в коллекци просто отвратное, но не будем об этом.</p></blockquote></div><p>Это извечная проблема: кто будет решать, что достойно, а что — нет.</p><p>P.S. Насколько я знаю, по сю пору нет ни одного вменяемого учебника по PoSH на русском языке. Впрочем, по WSH тоже не было.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 02 May 2013 21:39:07 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=71829#p71829</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Скрипт для массового копирования файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=71827#p71827</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Был не прав. Неверно интерпретировал работу оператора «-like». Вопрос, а почему не «-eq» там было, почему именно «-like»?</p></blockquote></div><p>В данном случае уместнее <strong>-eq</strong>, <strong>-like</strong> &quot;утащил&quot; из кода над которым работаю сейчас.<br />Согласно документации без использования знаков подстанови (&quot;*&quot;,&quot;?&quot;, &quot;[&quot;, &quot;]&quot; и т.п.) полностью аналогичен <strong>-eq</strong> (но не <strong>-ceq</strong> - Case sensitive EQ). Точнее, что-то среднее между <strong>-Match</strong> и <strong>-Eq</strong> <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />.<br /></p><div class="quotebox"><blockquote><p>Превосходно! Намного нагляднее. Глядишь, так и научусь. Когда-нибудь <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />.</p></blockquote></div><p>Это явно перебор <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />, там лишь пара исправлений.<br />Вообще, если размышлять о &quot;красивости&quot;, необходимо каким-то образом избавиься от конструкции (но таким образом теряем совместимость с v2):<br /></p><div class="codebox"><pre><code>
...
Where-Object {!$_.PSIsContainer} |
...
</code></pre></div><p>и двойного сравнения через <strong>-and</strong> (ума не приложу как, и сам хочу понять, как сравнить строку с массивом строк - может быть поменять их местами?), а в идеале и от <strong>Get-ChildItem -Recurse</strong> - т.к. &quot;знающие люди&quot; говорят про низкую скорость работы (требует проверки - насколько? во сколько раз?). <br /></p><div class="quotebox"><blockquote><p>Не догадался до более изящного решения, приведённого Вами. Что нашёл из связки PowerShell&#039;а и .Net, то и пробовал. А нагляднее — потому как на мой взгляд сравнение дат даёт большую наглядность, нежели сравнение строк.</p></blockquote></div><ol class="decimal"><li><p>Использование &quot;<strong><em>inline dotNet</em></strong>&quot; - это, конечно, фича, но не вижу смысла использовать её везде, где только можно. Логично предположить - там где &quot;стандартное&quot; решение невозможно и нет альтернатив, или стандартное решение и/или альтернативы &quot;убоги&quot; для данной задачи.</p></li><li><p>Зачем сравнивать по дням и мучаться с вычислением дней в месяце когда в условии чёткая формулировка &quot;за 1 конкретный месяц&quot; (операционки нынче умные и создать файл с датой 30.02.2013 попросту не смогут)?</p></li></ol><p>В данном направлении есть интересная заметка у <a href="http://www.sysadmins.lv">Vadims Pod?ns</a>:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Алиасы</div><div class="fancy_spoiler"><p><a href="http://www.sysadmins.lv/PermaLink,guid,973c54bb-f8c6-49bb-b844-2535c03b1c86.aspx">Алиасы, here strings и несколько практических советов при работе с текстом</a><br />Семантика языка PowerShell подразумевает использование унифицированного синтаксиса, где название каждой команды явно говорит о том, что она делает. Например, Get-Process. Совершенно очевидно, что эта команда должна делать. Но, порой, эти команды бывают очень длинными и набирать их постоянно в консоли бывает не очень удобно. Например, самый топовый — Get-ChildItem. Это даже не самая длинная команда, просто наиболее часто используемая. Или Foreach-Object. Даже автозавершение команд не всегда спасает ситуацию. Для этого были придуманы алиасы (короткие ссылки на команды), которые очень выгодно использовать в консоли. Так же у команд есть и очень длинные параметры. Например, всякие –InputObject, –Include, –ErrorAction и т.д. PowerShell позволяет сокращать параметры первыми буквами до тех пор, пока эти буквы не будут явно указывать на конкретное название. Например, у команды Get-ChildItem параметр –Include может быть сокращён до –I, а –Exclude до –Ex. Но многие скриптописатели пишут скрипты (и выкладывают их даже где-то) с использованием этих самых алиасов и коротких обозначений параметров.</p><p>Хорошо это или плохо? Ответ очевидный — за такое надо бить больно сапогами и по лицу. Использование алиасов приводит нас обратно к одной из проблем оболочки cmd — сразу не скажешь, что делает та или иная команда. Пользователь без соответствующей подготовки вряд ли сходу скажет, что делает команда regsvr32 или что делает ключ /i этой команды. Или вот 2 примера:</p><p>&nbsp; &nbsp; gps iex* | spps -f<br />&nbsp; &nbsp; ls .\ -r -fo | %{cp $_.fullname -des e:\ -ea 0}</p><p>Вы можете такое использовать в консоли, но не в скриптах. В скриптах эти две строчки должны выглядить только вот так:</p><p>&nbsp; &nbsp; Get-Process iex* | Stop-Process -Force<br />&nbsp; &nbsp; Get-ChildItem .\ -Recurse -Force | ForEach-Object {Copy-Item $_.fullname -Destination e:\ -ErrorAction SilentlyContinue}</p><p>вот такое написание значительно повышает читабельность кода и можно понять его работу даже без выполнения, а просто на стадии чтения и, если они есть, обнаружить какие-то ошибки. Да и вы сами со временем можете забыть, что это был за алиас и на что он ссылается. Уважайте себя и других.</p><p>Пользователи PowerGUI Script Editor могут воспользовться адд-оном, написанным одним пошикмвп Шейем Леви (Shay Levy) — Expand Alias, который автоматически разворачивает алиасы в их полное значение.</p></div></div><p>Также многие моменты/вещи можно &quot;утянуть&quot;/&quot;подсмотреть&quot; в блоге, например <strong>PS_FCIV</strong>, который, правда, требует допила, для того чтобы быть внешне совместимым с оригинальным <strong>fciv.exe</strong> (есть проблемы вида - &quot;не умею обрабатывать одиночный файл, к примеру - вычислить его MD5&quot; и &quot;вырвиглазый вывод на консоль&quot;).<br /></p><div class="quotebox"><blockquote><p>У меня любые скрипты будут похожи на VBScript <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />. Да и вообще — от обилия начинаешь иной раз теряться: однажды долго и упорно искал, почему не работает некая конструкция — оказалось, что мне привиделось это из другого языка.</p></blockquote></div><p>Чтож, от этого не убежишь, &quot;все люди ошибаются, т.к. людям свойственно ошибаться&quot;. И всё требует знаний, умений и практики.<br />Быть &quot;универсалом&quot; страшная вешь - несмотря на горы знаний, &quot;большим&quot; специалистом всё равно не стать, посему лучше избрать свою, довольно узкую стезю и работать в её пределах, отвлекаясь лишь на поверхностное изучение как смежных, так и далёких областей. <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /><br />К примеру, у меня стойкая антипатия к <strong>*Basic*</strong>, потому что &quot;он, по обыкновению, нигде, никому не нужен&quot; (личная &quot;фобия&quot; <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />, хотя как язык для обучения, наверное, один из самых лучших).<br /></p><div class="quotebox"><blockquote><p>«Их у нас был»<br />...<br />Завести, конечно, можно, но пока не будет массового перехода корпоративных клиентов на Windows 7 (с будущего года, полагаю), рассчитывать на увеличение активности не стоит.<br />...</p></blockquote></div><p>Нет проблем, &quot;... нет ребята, я не гордый, я согласен на медаль ...&quot;. <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /><br />Качество и т.н. &quot;нужность/необходимость&quot; кода в коллекци <em>просто отвратное</em>, но не будем об этом.</p>]]></description>
			<author><![CDATA[null@example.com (UNDYING)]]></author>
			<pubDate>Thu, 02 May 2013 16:07:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=71827#p71827</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Скрипт для массового копирования файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=71825#p71825</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>а в феврале что за &quot;грабли&quot;. Другими словами - как это выражается (можно ссылку и т.п.)?</p></blockquote></div><p>Был не прав. Неверно интерпретировал работу оператора «-like». Вопрос, а почему не «-eq» там было, почему именно «-like»?</p><div class="quotebox"><blockquote><p>Как-то так, без преобразования даты в строку…</p></blockquote></div><p>Превосходно! Намного нагляднее. Глядишь, так и научусь. Когда-нибудь <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />.</p><div class="quotebox"><blockquote><p>И я бы сказал для &quot;детского скрипта&quot;, каким он, всё-таки, является - это &quot;извращение&quot;.</p></blockquote></div><p>Не догадался до более изящного решения, приведённого Вами. Что нашёл из связки PowerShell&#039;а и .Net, то и пробовал. А нагляднее — потому как на мой взгляд сравнение дат даёт большую наглядность, нежели сравнение строк.</p><p>У меня любые скрипты будут похожи на VBScript <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />. Да и вообще — от обилия начинаешь иной раз теряться: однажды долго и упорно искал, почему не работает некая конструкция — оказалось, что мне привиделось это из другого языка.</p><div class="quotebox"><blockquote><p>а не пора ли создать раздел для PoSh?</p></blockquote></div><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;«Их у нас был»</div><div class="fancy_spoiler"><p>Самоликвидировался по причине почти полного отсутствия активности в нём. Там, почитай, один коллега <strong>greg zakharov</strong> и был. Раздел в Коллекции остался. Завести, конечно, можно, но пока не будет массового перехода корпоративных клиентов на Windows 7 (с будущего года, полагаю), рассчитывать на увеличение активности не стоит. Соотношение CMD/WSH/PoSH (здесь) — примерно как 100/70/1. Пусть пока будут в <a href="http://forum.script-coding.com/viewforum.php?id=22">Прочие скриптовые технологии и близкие к ним</a>. Будет заметная и <em>постоянная</em> активность — собрать темы в отдельный раздел труда не составит.</p></div></div>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 02 May 2013 14:03:45 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=71825#p71825</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Скрипт для массового копирования файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=71824#p71824</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p> а в феврале может выдавать лишнее.</p></blockquote></div><p>Ну насчёт января ясно, а в феврале что за &quot;грабли&quot;. Другими словами - как это выражается (можно ссылку и т.п.)?<br /></p><div class="quotebox"><blockquote><p>Get-ChildItem -Path &quot;E:\Песочница\0244\Source\<strong>*.txt</strong>&quot; -Recurse ...</p></blockquote></div><p>Если память не изменяет, есть параметры <strong>-Filter</strong> и <strong>-Include</strong> - &quot;нагляднее&quot; маску складывать туда, а &quot;путь оставить путём&quot;. (Правда это выглядит уже как нападки с моей стороны <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />)<br /></p><div class="codebox"><pre><code>
$sPrevMonthDate = ((Get-Date).AddMonths(-1)).ToString(&quot;MM.yyyy&quot;)

Get-ChildItem -Path &quot;E:\Песочница\0244\Source\*.txt&quot; -Recurse |`
    Where-Object {!$_.PSIsContainer} |`
        Where-Object {($_.CreationTime).ToString(&quot;MM.yyyy&quot;) -eq $sPrevMonthDate} 
</code></pre></div><p>По сути верно &quot;вогнать&quot; в <strong>$sPrevMonthDate</strong> месяц для сравнения и не заниматься этим для каждого вызова <strong>Where-Object</strong>, но зато каждый раз вызывается метод объекта и сравниваются строки. Скажем так, надо будет посмотреть как &quot;поизящней&quot; воплотить сравнение дат. Для объектного языка это критично, т.к. теряется основной смысл объектов.<br />И у PoSh есть существенный недостаток (во всяком случае для меня) - сложно рассматривать конструкции &quot;в уме&quot; или &quot;на бумаге&quot; - обязательно надо пробовать - что оно такое и как оно себя ведёт вообще. <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p><p>Как-то так, без преобразования даты в строку:<br /></p><div class="codebox"><pre><code>
$sPrevMonthDate = (Get-Date).AddMonths(-1)

Get-ChildItem -Path &quot;E:\Песочница\0244\Source&quot; -Filter *.txt -Recurse |`
    Where-Object {!$_.PSIsContainer} |`
        Where-Object {($_.CreationTime).Month -eq $sPrevMonthDate.Month -and ($_.CreationTime).Year -eq $sPrevMonthDate.Year} 
</code></pre></div><p>И ещё:<br /></p><div class="quotebox"><blockquote><p>Второй вариант короче, но первый — нагляднее.</p></blockquote></div><p>Мне так не кажется - виноваты конструкты типа:<br /></p><div class="codebox"><pre><code>
... -Day ([System.DateTime]::DaysInMonth($dtPrevMonthDate.Year, $dtPrevMonthDate.Month))
</code></pre></div><p>Дольше времени требуется на анализ &quot;а что-таки автор имел в виду на самом деле?&quot;. И я бы сказал для &quot;детского скрипта&quot;, каким он, всё-таки, является - это &quot;извращение&quot;.<br />Хотя, &quot;оффтоп&quot; я тут развёл, поэтому меня не покидает мысль - а не пора ли создать раздел для PoSh?</p>]]></description>
			<author><![CDATA[null@example.com (UNDYING)]]></author>
			<pubDate>Thu, 02 May 2013 12:35:24 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=71824#p71824</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Скрипт для массового копирования файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=71823#p71823</link>
			<description><![CDATA[<p><strong>UNDYING</strong>, спасибо, ясно.</p><p>Условие «$_.CreationTime.Month -Like ((Get-Date).Month -1 ) -and $_.CreationTime.Year -Like (Get-Date).Year» не гоже: не сработает в январе, а в феврале может выдавать лишнее.</p><p>Как-то так:<br /></p><div class="codebox"><pre><code>$dtPrevMonthDate = (Get-Date).AddMonths(-1)

$iFromDate = Get-Date -Year $dtPrevMonthDate.Year -Month $dtPrevMonthDate.Month -Day 1
$iToDate   = Get-Date -Year $dtPrevMonthDate.Year -Month $dtPrevMonthDate.Month -Day ([System.DateTime]::DaysInMonth($dtPrevMonthDate.Year, $dtPrevMonthDate.Month))

Get-ChildItem -Path &quot;E:\Песочница\0244\Source\*.txt&quot; -Recurse |`
    Where-Object {!$_.PSIsContainer} |`
        Where-Object {$_.CreationTime -ge $iFromDate -and $_.CreationTime -le $iToDate} 
</code></pre></div><p>или так:<br /></p><div class="codebox"><pre><code>$sPrevMonthDate = ((Get-Date).AddMonths(-1)).ToString(&quot;MM.yyyy&quot;)

Get-ChildItem -Path &quot;E:\Песочница\0244\Source\*.txt&quot; -Recurse |`
    Where-Object {!$_.PSIsContainer} |`
        Where-Object {($_.CreationTime).ToString(&quot;MM.yyyy&quot;) -eq $sPrevMonthDate} 
</code></pre></div><p>Второй вариант короче, но первый — нагляднее.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 02 May 2013 12:22:16 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=71823#p71823</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Скрипт для массового копирования файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=71820#p71820</link>
			<description><![CDATA[<div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;На правах оффтопика…</div><div class="fancy_spoiler"><div class="quotebox"><blockquote><p>Опять же не очень изящно перемещать для подсчёта файлы туда-сюда по папкам, но толковее пока среди инструментария bat ничего не нашёл.</p><p>Не могу не отметить убогость конструкции оператора /D -1 (указание даты только в сутках) в Windows по сравнению с Linux-оператором date -d &quot;1 month ago&quot;. Почувствуйте разницу! А можно написать и date -d &quot;1 year ago&quot; и нет необходимости вычислять количество дней в году и месяце...</p></blockquote></div><p>Так никто не запрещает Вам для решения задачи использовать Ваш любимый дистрибутив GNU\Linux, *BSD, Solaris, AIX, Irix и т.п. Также как никто Вас не ущемлял в выборе инструмента - sh (bash/zsh/tcsh/прочие), perl, python, Java, C/CPP и прочие.<br />Нисколько не хочу разжигать &quot;холивар&quot; и беспочвенные дискуссии, но тем кому необходимо &quot;почуствовать&quot; мощь, врядли будут её искать в узкоспециализированном разделе форума.</p></div></div><div class="quotebox"><blockquote><p>«Get-ChildItem -Recurse -File»: «-File» — это в третьей версии такое появилось?</p></blockquote></div><p>Видимо да, в блоге у некто &quot;Kazun&quot;&nbsp; было описание - &quot;как новая возможность в v3&quot;.</p>]]></description>
			<author><![CDATA[null@example.com (UNDYING)]]></author>
			<pubDate>Thu, 02 May 2013 10:00:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=71820#p71820</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Скрипт для массового копирования файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=71819#p71819</link>
			<description><![CDATA[<p>«Get-ChildItem -Recurse <span style="color: red">-File</span>»: «-File» — это в третьей версии такое появилось?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 02 May 2013 09:59:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=71819#p71819</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Скрипт для массового копирования файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=71816#p71816</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Перемещение всех файлов по дате:<br />forfiles /M *.txt /D -1 /C &quot;cmd /c move @file c:\123&quot;<br />Не очень, конечно, изящно, но учитывая что скрипт будет запускаться по первым числам, конструкция /D -1 вполне годна.</p></blockquote></div><div class="quotebox"><blockquote><p>- в одной директории находить все файлы, <strong>созданные</strong> за прошлый месяц;</p></blockquote></div><div class="quotebox"><blockquote><p>forfiles /?<br />...<br />&nbsp; &nbsp; /D&nbsp; &lt;дата&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Выбор файлов, у которых дата <strong>последнего изменения</strong><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; больше или равна (+) либо меньше или равна<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (-) указанной дате при использовании формата<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;dd.MM.yyyy&quot;; либо файлов, у которых дата&nbsp; последнего<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; изменения больше или равна (+)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; текущей дате плюс &quot;dd&quot; дней либо меньше или<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; равна (-) текущей дате минус &quot;dd&quot; дней.<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Допустимым числом дней &quot;dd&quot; является любое<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; число в диапазоне 0 - 32768.<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot;+&quot; используется по умолчанию, если знак не указан.<br />...</p></blockquote></div><div class="quotebox"><blockquote><p>Не могу не отметить убогость конструкции оператора /D -1 (указание даты только в сутках) в Windows по сравнению с Linux-оператором date -d &quot;1 month ago&quot;. Почувствуйте разницу! А можно написать и date -d &quot;1 year ago&quot; и нет необходимости вычислять количество дней в году и месяце...</p></blockquote></div><p>Может тогда <a href="http://gnuwin32.sourceforge.net">GnuWin</a> ?</p><p>Если вам подойдёт PowerShell (больше подходит под ваши требования):<br /></p><div class="quotebox"><blockquote><p>- в одной директории находить все файлы, созданные за прошлый месяц;</p></blockquote></div><div class="codebox"><pre><code>
$a = Get-ChildItem -Recurse -File | where {$_.CreationTime.Month -Like ((Get-Date).Month -1 ) -and $_.CreationTime.Year -Like (Get-Date).Year}
</code></pre></div><div class="quotebox"><blockquote><p>- перемещать их в отдельную папку;</p></blockquote></div><p>Зачем? - Вы их потом всё равно удалите.</p><div class="quotebox"><blockquote><p>- в текстовый файл выводить информацию об их количестве и суммарном объёме;</p></blockquote></div><div class="codebox"><pre><code>
$a.Length                # count of objects in array
$a.FullPath | foreach {$s += $_.Length}        # $s = size in bytes
</code></pre></div><div class="quotebox"><blockquote><p>- в другой (или этот же, неважно) файл выводить информацию о количестве и суммарном объёме файлов со строкой «строка 1»;</p></blockquote></div><div class="codebox"><pre><code>
$fileswithstring1 = Select-String -Path $a.Fullname -Pattern &quot;string1&quot; -List
$fileswithstring1.Lenght    # Count files
$fileswithstring1.FullPath | foreach {$fileswithstring1size += $_.Length}    # Calculate filesizes
</code></pre></div><div class="quotebox"><blockquote><p>- в другой (или этот же, неважно) файл выводить информацию о количестве и суммарном объёме файлов со строкой «строка 2»;</p></blockquote></div><div class="codebox"><pre><code>
$fileswithstring2 =  Select-String -Path $a.Fullname -Pattern &quot;string2&quot; -List
$fileswithstring2.Lenght    # Count files
$fileswithstring2.FullPath | foreach {$fileswithstring2size += $_.Length}
</code></pre></div><div class="quotebox"><blockquote><p>- запускать WinRAR на архивацию всех найденных и перемещённых файлов за прошлый месяц с максимальным сжатием;</p></blockquote></div><div class="codebox"><pre><code>
$a.FullPath &gt; &quot;Path_to_file&quot;
# не являюсь знатоком опций WinRar, должно быть как-то так:
winrar a -m9 -Include &quot;Path_to_file&quot; 123.rar
</code></pre></div><div class="quotebox"><blockquote><p>- удалять исходные файлы после архивации файлы;</p></blockquote></div><div class="codebox"><pre><code>
$a | Remove-Item
</code></pre></div><p>Если же PowerShell не подходит, далее возможны варианты:<br /></p><div class="quotebox"><blockquote><p>скрипт будет запускаться по первым числам</p></blockquote></div><div class="codebox"><pre><code>forfiles /d +01.04.2013</code></pre></div><p>Более правильный вариант для запуска скрипта 01.05.2013, как работать с датой - посмотрите в &quot;коллекции&quot;.<br />Размер файла:<br /></p><div class="codebox"><pre><code>for %a in (&quot;file_path_and_name&quot;) do (echo %~za)</code></pre></div><p>или через <strong>dir</strong>.<br />Подсчёт кол-ва - через <strong>for</strong>, повсеместно встречается на форуме.<br />Вообще получится довольно-таки медленное и монструозное решение, если хотите пойти таким путём попытайтесь разбить каждый пункт &quot;хотелок&quot; на минимальные (атомарные) операции.</p><p>Ещё возможно решение средствами <strong>winrar</strong> - он умеет архивировать файлы по дате. Подойдёт, если размер данных небольшой.</p>]]></description>
			<author><![CDATA[null@example.com (UNDYING)]]></author>
			<pubDate>Thu, 02 May 2013 09:15:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=71816#p71816</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Скрипт для массового копирования файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=71811#p71811</link>
			<description><![CDATA[<p>Ну, в каком-то смысле любая проблема, требующая решения это задание <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>Пока вот что удалось сделать самому:</p><br /><p>Перемещение всех файлов по дате:<br /></p><div class="codebox"><pre><code>forfiles /M *.txt /D -1 /C &quot;cmd /c move @file c:\123&quot;</code></pre></div><p>Не очень, конечно, изящно, но учитывая что скрипт будет запускаться по первым числам, конструкция /D -1 вполне годна.</p><p>Перемещение файлов, содержащих нужную строку:<br /></p><div class="codebox"><pre><code>@echo of
setlocal enabledelayedexpansion
for /f &quot;tokens=*&quot; %%a in (&#039;findstr /M &quot;строка 1&quot; *.txt&#039;) do (move &quot;%%a&quot; c:\123)</code></pre></div><p>Опять же не очень изящно перемещать для подсчёта файлы туда-сюда по папкам, но толковее пока среди инструментария bat ничего не нашёл.</p><p>Не могу не отметить убогость конструкции оператора /D -1 (указание даты только в сутках) в Windows по сравнению с Linux-оператором date -d &quot;1 month ago&quot;. Почувствуйте разницу! А можно написать и date -d &quot;1 year ago&quot; и нет необходимости вычислять количество дней в году и месяце...</p>]]></description>
			<author><![CDATA[null@example.com (akt)]]></author>
			<pubDate>Thu, 02 May 2013 05:43:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=71811#p71811</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Скрипт для массового копирования файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=71807#p71807</link>
			<description><![CDATA[<p>Похоже на задание.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Wed, 01 May 2013 20:48:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=71807#p71807</guid>
		</item>
		<item>
			<title><![CDATA[CMD/BAT: Скрипт для массового копирования файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=71804#p71804</link>
			<description><![CDATA[<p>Уважаемые гуру!</p><p>Прошу помощи в написании bat-скрипта для массового копирования файлов.</p><p>Нужно:</p><p>- в одной директории находить все файлы, созданные за прошлый месяц;<br />- перемещать их в отдельную папку;<br />- в текстовый файл выводить информацию об их количестве и суммарном объёме;<br />- в другой (или этот же, неважно) файл выводить информацию о количестве и суммарном объёме файлов со строкой «строка 1»;<br />- в другой (или этот же, неважно) файл выводить информацию о количестве и суммарном объёме файлов со строкой «строка 2»;<br />- запускать WinRAR на архивацию всех найденных и перемещённых файлов за прошлый месяц с максимальным сжатием;<br />- удалять исходные файлы после архивации файлы;</p><br /><p>Премного благодарен за ответы!</p>]]></description>
			<author><![CDATA[null@example.com (akt)]]></author>
			<pubDate>Wed, 01 May 2013 19:33:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=71804#p71804</guid>
		</item>
	</channel>
</rss>
