<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; WSH,VBS,JS: Архивация и перемещение файлов в NAS]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=17863</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=17863&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «WSH,VBS,JS: Архивация и перемещение файлов в NAS».]]></description>
		<lastBuildDate>Wed, 12 Jul 2023 07:03:07 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: WSH,VBS,JS: Архивация и перемещение файлов в NAS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=158707#p158707</link>
			<description><![CDATA[<p>Ну и как-то неспокойно мне на душе, что в разделе VBS/JS мы BAT-файлами увлеклись. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Для очистки совести привожу аналогичное решение на VBS.<br /></p><div class="codebox"><pre><code>&#039; Можно требовать объявления переменных, раскомментировав строчку:
&#039; Option Explicit

&#039; В случае ошибки переходить к следующему оператору
On Error Resume Next
&#039; Альтернатива - в случае ошибки прекращать выполнение программы:
&#039; On Error GoTo 0

	&#039; Полезные объекты для работы:
	Set goShellApp = CreateObject(&quot;Shell.Application&quot;)
	Set goWsShell  = CreateObject(&quot;WScript.Shell&quot;)
	Set goFSO      = CreateObject(&quot;Scripting.FileSystemObject&quot;)

	&#039; Папка логов:
	sDirLog = &quot;C:\LOG&quot;

	&#039; Папка архивов, можно заменить &quot;C:\LOG\ARH&quot; на &quot;\\nas\*\наименование папки&quot;:
	sDirArh = &quot;C:\LOG\ARH&quot;
	goFSO.CreateFolder(gsDirArh)

	&#039; Маска LOG-файлов:
	sMaskLog = &quot;*.log&quot;

	&#039; Временный файл, будет содержать список архивируемых .log-файлов.
	sFileTmp = goFSO.BuildPath(goWsShell.ExpandEnvironmentStrings(&quot;%TEMP%&quot;), goFSO.GetTempName())

	&#039; dNow = сегодняшняя дата.
	dNow = Now()

	&#039; Файл-архива, в имени содержится текущая дата:
	sFileArh = goFSO.BuildPath(sDirArh, &quot;#&quot; &amp; myFormatDateYMD(dNow, &quot;-&quot;) &amp; &quot;.7z&quot;)

	&#039; Можно уменьшить nNow, чтобы архивировать файлы старше вчерашних.
	&#039; 	* если отнимать 1 - удаляются вчерашние файлы и более ранние;
	&#039; 	* если отнимать 2 - удаляются позавчерашние файлы и более ранние;
	&#039; 	* и т.д.
	&#039; Целые числа означают дни, дробные - части дня (часы, минуты, секунды).
	&#039; Примеры: dNow = 12.07.2023 10:09:26, dNow - 1 = 11.07.2023 10:09:26 (минус день), dNow - 1/24 = 12.07.2023 09:09:26 (минус час), dNow - 1/24/60 = 12.07.2023 10:08:26 (минус минута).
	dNow = dNow - 1

	&#039; Заполнение списка по условию: дата создания файла меньше сегодняшней (dFile &lt; dNow).
	sFiles = &quot;&quot;

	Set oFiles = goFSO.GetFolder(sDirLog).Files
	For Each oFile In oFiles
		If StrComp(goFSO.GetExtensionName(oFile.Path), goFSO.GetExtensionName(sMaskLog), vbTextCompare) = 0 Then
			&#039; Проверяется дата изменения, можно проверять и на дату создания: oFile.DateCreated.
			If oFile.DateLastModified &lt; dNow Then
				sFiles = sFiles &amp; oFile.Path &amp; vbCrLf
			End If
		End If
	Next &#039;oFile
	Set oFiles = Nothing
	Set oFile  = Nothing

	If sFiles = &quot;&quot; Then
		WScript.Echo &quot;*** Нет подходящих файлов для архивирования!&quot;
	Else

		&#039; Записываем список файлов в sFileTmp
		With goFSO.CreateTextFile(sFileTmp, True) &#039;File, Overwrite
			.Write(sFiles)
			.Close
		End With

		&#039; Архивируем:
	    &#039; -scsWIN задаёт кодировку WIN для списка файлов sFileTmp (чтобы не было проблем с кириллицей, по ум. у 7z: UTF-8)
    	&#039; -sdel удаляет архивированные файлы 

    	&#039; Run(&lt;Command&gt;,&lt;WindowStyle&gt;,&lt;WaitOnReturn&gt;), WindowStyle - 0 Hidden - 1 Normal - 2 Minimized - 3 Maximized
    	goWsShell.Run Chr(34) &amp; &quot;7z.exe&quot; &amp; Chr(34) &amp; &quot; a &quot; &amp; Chr(34) &amp; sFileArh &amp; Chr(34) &amp; &quot; &quot; &amp; Chr(34) &amp; &quot;@&quot; &amp; sFileTmp &amp; Chr(34) &amp; &quot; -scsWIN -sdel&quot;, 1, 1

		goFSO.DeleteFile sFileTmp, True &#039;File, Force_delete_read-only

		If goFSO.FileExists(sFileArh) Then
			WScript.Echo &quot;Создан архив: &quot; &amp; sFileArh
		Else
			WScript.Echo &quot;*** Ошибка создания архива: &quot; &amp; sFileArh
		End If

	End If
	  
	&#039; По окончании работы программы желательно/необходимо все созданные объекты удалить:
	Set goShellApp = Nothing
	Set goWsShell  = Nothing
	Set goFSO      = Nothing

&#039; Выход с кодом возврата
WScript.Quit(0)

&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;
&#039;&quot;29.10.2019&quot;, &quot;-&quot; =&gt; &quot;2019-10-29&quot;
&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;&#039;
Function myFormatDateYMD(dDate, sSep)
  myFormatDateYMD = Right(&quot;0000&quot; &amp; DatePart(&quot;yyyy&quot;, dDate), 4) &amp; sSep &amp; _
                    Right(&quot;00&quot;   &amp; DatePart(&quot;m&quot;   , dDate), 2) &amp; sSep &amp; _
                    Right(&quot;00&quot;   &amp; DatePart(&quot;d&quot;   , dDate), 2) 
End Function
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Wed, 12 Jul 2023 07:03:07 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=158707#p158707</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH,VBS,JS: Архивация и перемещение файлов в NAS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=158706#p158706</link>
			<description><![CDATA[<p><strong>Classified</strong>, это сообщение из текста программы: &quot;*** Нет подходящих файлов для архивирования!&quot;, выведенное в консоль (кодировка символов DOS-866) из созданного вами BAT-файла в кодировке UTF-8. Нужно было создавать файл с кодировкой DOS-866 и вставлять туда текст программы.<br />Я прикрепляю свой BAT-файл (в архиве), он уже в нужной кодировке.<br />Для последующего редактирования можно использовать любой программный редактор (Notepad++ и др.), задавая кодировку исходного текста DOS-866.<br />Лично я пользуюсь встроенным редактором FAR.</p><p>Добавил в код строку с уменьшением номера текущего дня.<br /></p><ul><li><p>если отнимать 0 (или удалить строку) - то будет работать как раньше, удаляя вчерашние файлы и более ранние;</p></li><li><p>если отнимать 1 - удаляются позавчерашние файлы и более ранние (вчерашние не трогаем, т.к. могли быть созданы менее 24 часов назад);</p></li><li><p>и т.д.</p></li></ul><div class="codebox"><pre><code>  rem Можно уменьшить nNow, чтобы архивировать файлы старше вчерашних.
  set /a nNow = nNow - 1
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Wed, 12 Jul 2023 03:45:41 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=158706#p158706</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH,VBS,JS: Архивация и перемещение файлов в NAS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=158705#p158705</link>
			<description><![CDATA[<p><strong>andypetr</strong> Спасибо, пробовал. Сменил директории в коде, но в итоге абра-кадабра получилась. Не понимаю, где ошибка.</p>]]></description>
			<author><![CDATA[null@example.com (Classified)]]></author>
			<pubDate>Tue, 11 Jul 2023 13:04:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=158705#p158705</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH,VBS,JS: Архивация и перемещение файлов в NAS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=158704#p158704</link>
			<description><![CDATA[<p><strong>Classified</strong>, к сожалению у 7-zip я не нашёл такой замечательной возможности (отбор файлов по дате).</p><p>У меня для такой достаточно простой задачи (типа удаления старых логов) больше лежит душа к использованию BAT.<br />Просто сам код лаконичнее получается, чем было бы на VBS: не нужно возиться с объектами FileSystemObject, File, TextStream и т.п.<br />Если всё же есть необходимость реализовать это именно в VBS/JS и не устраивает &quot;костыль&quot; описанный ниже - то можно и на VBS это изобразить.<br />Но будет не 15 строк, а в 2-3 раза больше.</p><p>Основная проблема с BAT - это сравнение дат.<br />В примере ниже используются процедуры от dostips.com для определения у даты файла юлианского номера дня.<br />Соответственно, мы сегодня архивируем файлы не точно с суточной разницей в датах, а просто вчерашние и более поздние - время не участвует в сравнении, только сама дата.</p><div class="codebox"><pre><code>@echo off &amp; title %~nx0 &amp; SetLocal EnableExtensions EnableDelayedExpansion

  rem Папка логов:
  set &quot;sDirLog=C:\LOG&quot;

  rem Папка архивов, можно заменить &quot;C:\LOG\ARH&quot; на &quot;\\nas\*\наименование папки&quot;:
  set &quot;sDirArh=C:\LOG\ARH&quot;
  md &quot;!sDirArh!&quot; &gt;nul 2&gt;&amp;1

  rem Маска LOG-файлов:
  set &quot;sMaskLog=*.log&quot;

  rem Временный файл, будет содержать список архивируемых .log-файлов.
  set &quot;sFileTmp=%TEMP%\%~n0_%RANDOM%.tmp&quot;

  rem nNow = сегодняшняя дата.
  call :jDate nNow

  rem Файл-архива, в имени содержится текущая дата:
  call :jdate2date !nNow! nYYYY nMM nDD
  set &quot;sFileArh=!sDirArh!\#!nYYYY!!nMM!!nDD!.7z&quot;

  rem Заполнение списка по условию: дата создания файла меньше сегодняшней (nFile &lt; nNow).
  for %%a in (&quot;!sDirLog!\!sMaskLog!&quot;) do (
    call :fTime nFile &quot;%%~a&quot;
    if !nFile! lss !nNow! echo.%%~a&gt;&gt;&quot;!sFileTmp!&quot;
  )

  if exist &quot;!sFileTmp!&quot; (
    rem -scsDOS задаёт кодировку DOS для списка файлов sFileTmp (чтобы не было проблем с кириллицей, по ум. у 7z: UTF-8)
    rem -sdel удаляет архивированные файлы 
    call &quot;7z.exe&quot; a &quot;!sFileArh!&quot; &quot;@!sFileTmp!&quot; -scsDOS -sdel
    del /q &quot;!sFileTmp!&quot; &gt;nul 2&gt;&amp;1
    echo.
    if exist &quot;!sFileArh!&quot; echo.Создан архив: &quot;!sFileArh!&quot;
  ) else (
    echo.*** Нет подходящих файлов для архивирования!
  )
  pause

Endlocal
exit /b

rem ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:ftime JD filename attr -- returns the file time in julian days
::                      -- JD    [out]    - valref file time in julian days
::                      -- attr  [in,opt] - time field to be used, creation/last-access/last-write, see &#039;dir /?&#039;, i.e. /tc, /ta, /tw, default is /tw
:$created 20060101 :$changed 20090322 :$categories DateAndTime
:$source http://www.dostips.com
SETLOCAL
  set file=%~2
  set attr=%~3
  if not defined attr (call:jdate JD &quot;- %~t2&quot;
  ) ELSE (for /f %%a in (&#039;&quot;dir %attr% /-c &quot;%file%&quot;|findstr &quot;^^[0-9]&quot;&quot;&#039;) do call:jdate JD &quot;%%a&quot;)
ENDLOCAL &amp; IF &quot;%~1&quot; NEQ &quot;&quot; (SET %~1=%JD%) ELSE (echo.%JD%)
EXIT /b

:jdate JD DateStr -- converts a date string to julian day number with respect to regional date format
::                -- JD      [out,opt] - julian days
::                -- DateStr [in,opt]  - date string, e.g. &quot;03/31/2006&quot; or &quot;Fri 03/31/2006&quot; or &quot;31.3.2006&quot;
:$reference http://groups.google.com/group/alt.msdos.batch.nt/browse_frm/thread/a0c34d593e782e94/50ed3430b6446af8#50ed3430b6446af8
:$created 20060101 :$changed 20080219
:$source http://www.dostips.com
SETLOCAL

  set DateStr=%~2&amp;if &quot;%~2&quot;==&quot;&quot; set DateStr=%date%

  for /f &quot;skip=1 tokens=2-4 delims=(-)&quot; %%a in (&#039;&quot;echo.|date&quot;&#039;) do (
      for /f &quot;tokens=1-3 delims=/.- &quot; %%A in (&quot;%DateStr:* =%&quot;) do (
          set %%a=%%A&amp;set %%b=%%B&amp;set %%c=%%C))

  rem { дд-мм-гг или dd-mm-yy в выводе &quot;echo.|date&quot;
  if /i &quot;%гг%&quot; == &quot;&quot; (
    set /a &quot;yy=10000%yy% %%10000,mm=100%mm% %% 100,dd=100%dd% %% 100&quot;
  ) else (
    set /a &quot;yy=10000%гг% %%10000,mm=100%мм% %% 100,dd=100%дд% %% 100&quot;
  )
  rem }

  set /a JD=dd-32075+1461*(yy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yy+4900+(mm-14)/12)/100)/4

ENDLOCAL &amp; IF &quot;%~1&quot; NEQ &quot;&quot; (SET %~1=%JD%) ELSE (echo.%JD%)
EXIT /b

:jdate2date JD YYYY MM DD -- converts julian days to gregorian date format
::                     -- JD   [in]  - julian days
::                     -- YYYY [out] - gregorian year, i.e. 2006
::                     -- MM   [out] - gregorian month, i.e. 12 for december
::                     -- DD   [out] - gregorian day, i.e. 31
:$reference http://aa.usno.navy.mil/faq/docs/JD_Formula.html
:$created 20060101 :$changed 20080219 :$categories DateAndTime
:$source http://www.dostips.com
SETLOCAL ENABLEDELAYEDEXPANSION
set /a L= %~1+68569,     N= 4*L/146097, L= L-(146097*N+3)/4, I= 4000*(L+1)/1461001
set /a L= L-1461*I/4+31, J= 80*L/2447,  K= L-2447*J/80,      L= J/11
set /a J= J+2-12*L,      I= 100*(N-49)+I+L
set /a YYYY= I,  MM=100+J,  DD=100+K
set MM=%MM:~-2%
set DD=%DD:~-2%
( ENDLOCAL &amp; REM RETURN VALUES
    IF &quot;%~2&quot; NEQ &quot;&quot; (SET %~2=%YYYY%) ELSE echo.%YYYY%
    IF &quot;%~3&quot; NEQ &quot;&quot; (SET %~3=%MM%) ELSE echo.%MM%
    IF &quot;%~4&quot; NEQ &quot;&quot; (SET %~4=%DD%) ELSE echo.%DD%
)
EXIT /b
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Tue, 11 Jul 2023 06:17:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=158704#p158704</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH,VBS,JS: Архивация и перемещение файлов в NAS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=158703#p158703</link>
			<description><![CDATA[<p><strong>andypetr</strong> Я планировал бесплатный 7zip, с ним возможно провести такие манипуляции?</p>]]></description>
			<author><![CDATA[null@example.com (Classified)]]></author>
			<pubDate>Mon, 10 Jul 2023 11:59:20 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=158703#p158703</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH,VBS,JS: Архивация и перемещение файлов в NAS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=158700#p158700</link>
			<description><![CDATA[<p>Добрый день.<br />А каким архиватором будете пользоваться?<br />У некоторых архиваторов такие богатые возможности (командная строка), что не нужно и программу писать.<br />Например, с помощью WinRAR:</p><div class="codebox"><pre><code>
@echo off &amp; title %~nx0 &amp; SetLocal EnableExtensions EnableDelayedExpansion
  rem Папка логов:
  set &quot;sDirLog=C:\LOG&quot;
  rem  Папка архивов, можно заменить &quot;C:\LOG\ARH&quot; на &quot;\\nas\*\наименование папки&quot;:
  set &quot;sDirArh=C:\LOG\ARH&quot;
  md &quot;!sDirArh!&quot; &gt;nul 2&gt;&amp;1
  call &quot;rar.exe&quot; m -ag#yymmdd-hhmmss -ep1 -to1d &quot;!sDirArh!\&quot; &quot;!sDirLog!\*.log&quot;
</code></pre></div><div class="codebox"><pre><code>
    m[f]    Переместить в архив [только файлы].
    -ag[формат]
            Добавить к имени архива текущие дату и время.
            Этот ключ добавляет к имени архива текущие дату и время при
            создании или обработке архива. Может пригодиться при регулярном
            создании резервных копий.
    -ep1    Исключить базовый каталог из имён.
    -to&lt;период&gt;
            Обрабатывать файлы более старые, чем указанный период времени.
            Задающая время строка имеет следующий формат:
            [&lt;дни&gt;d][&lt;часы&gt;h][&lt;минуты&gt;m][&lt;секунды&gt;s]
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Mon, 10 Jul 2023 10:39:39 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=158700#p158700</guid>
		</item>
		<item>
			<title><![CDATA[WSH,VBS,JS: Архивация и перемещение файлов в NAS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=158699#p158699</link>
			<description><![CDATA[<p>Добрый день.<br />Ситуация такая: 1С формирует логи каждый день и сохраняет их локальную папку например C:\log. <br />Чтобы не вычищать вручную, я создал batник на перемещение файлов с периодом 1 сутки перемещение файлов старше одного дня. Но можно ли создать скрипт, который будет архивировать файлы старше одного дня , удалять заархивированные файлы с диска и перемещать подготовленный архив на указанное место в локальной сети, например на \\nas\*\наименование папки.<br />Дальше bat я не делал скрипты и VBS для меня пока не сеянное поле, если есть подобный скрипт , то прошу помочь. Заранее благодарю</p>]]></description>
			<author><![CDATA[null@example.com (Classified)]]></author>
			<pubDate>Mon, 10 Jul 2023 07:55:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=158699#p158699</guid>
		</item>
	</channel>
</rss>
