<?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: Батник на 3 простых действия]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=17920</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=17920&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: Батник на 3 простых действия».]]></description>
		<lastBuildDate>Mon, 28 Aug 2023 03:40:38 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD/BAT: Батник на 3 простых действия]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159118#p159118</link>
			<description><![CDATA[<p><strong>teadrinker</strong>, да, спасибо за идею!<br />Код упростился, не нужно беспокоиться о повторении случайных чисел.</p><div class="codebox"><pre><code>On Error Resume Next

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

&#039; Глобальные установки:
	
nFileCount = 3 &#039; кол-во случайно обрабатываемых файлов
nLineCount = 3 &#039; кол-во строк для выборки из файлов
	
&#039; Создать список всех файлов:

Set oFilesTxt = CreateObject(&quot;Scripting.Dictionary&quot;)
Set oFiles = goFSO.GetFolder(goWsShell.CurrentDirectory).Files
&#039; ... заполнение словаря oFilesTxt:
For Each oFile In oFiles
	If StrComp(goFSO.GetExtensionName(oFile.Path), &quot;txt&quot;, vbTextCompare) = 0 Then
		oFilesTxt.Add oFile.Name, oFile.Path
	End If
Next &#039;oFile

If oFilesTxt.Count &lt; nFileCount Then
	WScript.Echo &quot;*** Недостаточно TXT-файлов!&quot;
	WScript.Quit(1)
End If

&#039; Сейчас в oFilesTxt содержится список всех TXT-файлов в папке.
&#039; Например, для 5 TXT-файлов: 
&#039; oFilesTxt.Items = [файл_01.txt, файл_02.txt, файл_03.txt, файл_04.txt, файл_05.txt].

&#039; ... имя файла-результата (случайное временное имя):
sFileRes = goFSO.GetTempName()
sLineRes = &quot;&quot; &#039; буфер файла-результата

&#039; Повторить три раза следующие действия:
Randomize &#039; инициализировать генератор случайных чисел (с помощью стистемного таймера).

For iFile = 0 To nFileCount-1
	&#039; Получить рандомное число от 0 до максимального индекса в списке:
	nRandom = Int((oFilesTxt.Count * Rnd) + 0) &#039; генерировать целое случайное число от 0 до oFilesTxt.Count-1.

	&#039; Использовать файл с индексом, равным полученному числу:
	sFileTxt = oFilesTxt.Items()(nRandom)
	WScript.Echo &quot;oFilesTxt(&quot;, nRandom, &quot;)=&quot;, sFileTxt

	&#039; Например, для 5 TXT-файлов и nRandom = 1: sFileTxt = &quot;файл_02.txt&quot;.

	&#039; ---------------------------------------------------------------------
	&#039; 1. В каждом файле оставить только 3 первых строки, остальные удалить.
	&#039; ---------------------------------------------------------------------
	With goFSO.OpenTextFile(sFileTxt, 1) &#039;ForReading
		For iLine = 0 To nLineCount-1
			&#039; ---------------------------------------------------------------------------------------------------------
			&#039; 2. В каждом файле оставить только ссылки. Цифры, которые расположены перед ссылками и символ &quot;;&quot; удалить.
			&#039; ---------------------------------------------------------------------------------------------------------
			aLine = Split(.ReadLine(), &quot;;&quot;) &#039;строка &quot;234324;Ссылка1&quot; =&gt; массив [234324, Ссылка1]
			If UBound(aLine) &gt; 0 Then &#039; проверка, что строка не пустая и есть хотя бы 1 разделитель &quot;;&quot;
				sLineRes = sLineRes &amp; aLine(1) &amp; vbCrLf &#039;&quot;Ссылка1&quot;
			End If
		Next &#039;iLine
		.Close
	End With

	&#039; Удалить этот файл из списка:
	oFilesTxt.Remove oFilesTxt.Keys()(nRandom)

	&#039; В нашем примере oFilesTxt.Items станет = [файл_01.txt, файл_03.txt, файл_04.txt, файл_05.txt].
	&#039; Поскольку имя обработанного файла удалено из списка, можно не беспокоиться о повторении случайного числа.
Next &#039;iFile

&#039; ... запись в файл-результат:
With goFSO.OpenTextFile(sFileRes, 2, True) &#039;Write, Create
	.Write(sLineRes)
	.Close
End With
	
WScript.Echo &quot;Создан файл&quot;, sFileRes

&#039; Выход с кодом возврата
WScript.Quit(0)
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Mon, 28 Aug 2023 03:40:38 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159118#p159118</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Батник на 3 простых действия]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159115#p159115</link>
			<description><![CDATA[<div class="quotebox"><cite>andypetr пишет:</cite><blockquote><p>заполнение массива aFiles случайными числами</p></blockquote></div><p>Интересный подход! <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Но не проще ли так:<br /></p><ul><li><p>Создать список всех файлов</p></li><li><p>Повторить три раза следующие действия:</p><ul><li><p>Получить рандомное число от 0 до максимального индекса в списке</p></li><li><p>Использовать файл с индексом, равным полученному числу</p></li><li><p>Удалить этот файл из списка</p></li></ul></li></ul><p>?<br />Хотя я не спец в vbs, может, какую-то глупость сказал! <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Fri, 25 Aug 2023 09:08:44 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159115#p159115</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Батник на 3 простых действия]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159114#p159114</link>
			<description><![CDATA[<p><strong>Rumata</strong>, вот на VBS решение.<br />Текста не меньше, чем в BAT получилось - не знаю, может я не оптимально написал.</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; Глобальные установки:
	nFileCount = 3 &#039; кол-во случайно обрабатываемых файлов
	nLineCount = 3 &#039; кол-во строк для выборки из файлов

	&#039; --------------------------------------------------
	&#039; 3.1. Выбирать рандомно при каждом запуске 3 файла.
	&#039; --------------------------------------------------

	Set oFiles = goFSO.GetFolder(goWsShell.CurrentDirectory).Files
	&#039; ... подсчёт общего кол-ва файлов *.txt в текущей папке, заполнение массива aFileTxt:
	nFileTotal = 0
	For Each oFile In oFiles
		If StrComp(goFSO.GetExtensionName(oFile.Path), &quot;txt&quot;, vbTextCompare) = 0 Then
			ReDim Preserve aFileTxt(nFileTotal)
			aFileTxt(nFileTotal) = oFile.Name
			nFileTotal = nFileTotal + 1
		End If
	Next &#039;oFile

	If nFileTotal &lt; nFileCount Then
		WScript.Echo &quot;*** Недостаточно TXT-файлов!&quot;
		WScript.Quit(1)
	End If

	&#039; ... заполнение массива aFiles случайными числами:

	Randomize &#039; инициализировать генератор случайных чисел (с помощью стистемного таймера).

	ReDim aFile(nFileCount-1)
	iFile = -1
	Do While iFile &lt; UBound(aFile)
		nRandom = Int((nFileTotal * Rnd) + 0) &#039; генерировать целое случайное число от 0 до nFileTotal-1.
		&#039; Проверка на повторение &quot;случайного&quot; числа в заполненной части aFile:
		For j = 0 To iFile
			If aFile(j) = nRandom Then
				WScript.Echo &quot;повтор: aFile(&quot;, j, &quot;)=&quot;, nRandom
				nRandom = -1
				Exit For
			End If
		Next &#039;j
		If nRandom &gt; 0 Then
			iFile = iFile + 1
			aFile(iFile) = nRandom
			WScript.Echo &quot;aFile(&quot;, iFile, &quot;)=&quot;, aFile(iFile)
		End If
	Loop 

	&#039; Сейчас в aFile содержится набор 3-х случайных целых чисел, соответствующих порядковым номерам TXT-файлов в папке.
	&#039; Например, для 5 TXT-файлов возможен такой набор: [5, 1, 3].
	&#039; А в aFileTXT содержатся имена TXT-файлов в папке.
	&#039; Далее будут в цикле обрабатываться значения aFileTxt(aFile(i)): [файл_05.txt, файл_01.txt, файл_03.txt].

	&#039; -------------------------------------------------------------
	&#039; 3.2. Склеивать данные и создавать новый файл с этими данными.
	&#039; -------------------------------------------------------------
	&#039; ... имя файла-результата (случайное временное имя):
	sFileRes = goFSO.GetTempName()
	sLineRes = &quot;&quot; &#039; буфер файла-результата

	&#039; ... создание буфера файла-результата:
	For iFile = 0 To UBound(aFile)
		WScript.Echo &quot;aFile(&quot;, iFile, &quot;)=&quot;, aFileTxt(aFile(iFile))
		&#039; ---------------------------------------------------------------------
		&#039; 1. В каждом файле оставить только 3 первых строки, остальные удалить.
		&#039; ---------------------------------------------------------------------
		With goFSO.OpenTextFile(aFileTxt(aFile(iFile)), 1) &#039;ForReading
			For iLine = 0 To nLineCount-1
				&#039; ---------------------------------------------------------------------------------------------------------
				&#039; 2. В каждом файле оставить только ссылки. Цифры, которые расположены перед ссылками и символ &quot;;&quot; удалить.
				&#039; ---------------------------------------------------------------------------------------------------------
				aLine = Split(.ReadLine(), &quot;;&quot;) &#039;строка &quot;234324;Ссылка1&quot; =&gt; массив [234324, Ссылка1]
				If UBound(aLine) &gt; 0 Then &#039; проверка, что строка не пустая и есть хотя бы 1 разделитель &quot;;&quot;
					sLineRes = sLineRes &amp; aLine(1) &amp; vbCrLf &#039;&quot;Ссылка1&quot;
				End If
			Next &#039;iLine
			.Close
		End With
	Next &#039;iFile

	&#039; ... запись в файл-результат:
	With goFSO.OpenTextFile(sFileRes, 2, True) &#039;Write, Create
		.Write(sLineRes)
		.Close
	End With
	
	WScript.Echo &quot;Создан файл&quot;, sFileRes

&#039; Выход с кодом возврата
WScript.Quit(0)
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Fri, 25 Aug 2023 08:33:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159114#p159114</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Батник на 3 простых действия]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159113#p159113</link>
			<description><![CDATA[<p>Под такие задачи лучше использовать нормальные языки, например, jvascript, vbscript, powershell.</p><p>1. получить список файлов<br />2. из файлов из п.1 выбрать 3 случайных файла<br />3. из каждого файла из п.2 прочитать 3 первые строки<br />4. из строк списка, полученного в п.3 выделить требуемые подстроки и вывести (на экран или в другой файл)</p><p>Возможны дальнейшие усложнения как то:что делать, если файлов меньше 3, или что делать, если строк в каждом файле меньше 3, или строка не соответствует определенным требованиям, или строка пустая. Ну и т.д.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 25 Aug 2023 05:54:24 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159113#p159113</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Батник на 3 простых действия]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159096#p159096</link>
			<description><![CDATA[<p><strong>denisss</strong>, добрый день.<br />Вот, насколько понял по описанию задачи.<br /></p><div class="codebox"><pre><code>@echo off &amp; title %~nx0 &amp; SetLocal EnableExtensions EnableDelayedExpansion

rem Глобальные установки:
rem кол-во случайно обрабатываемых файлов
set /a nFileCount = 3
rem кол-во строк для выборки из файлов
set /a nLineCount = 3

rem --------------------------------------------------
rem 3.1. Выбирать рандомно при каждом запуске 3 файла.
rem --------------------------------------------------

rem ... подсчёт общего кол-ва файлов *.txt в текущей папке:
set /a nFileTotal = 0
for %%a in (*.txt) do set /a nFileTotal += 1
rem echo.Всего файлов: !nFileTotal!

if !nFileTotal! lss !nFileCount! echo.*** Недостаточно файлов.&amp;goto :End

rem ... заполнение &quot;массива&quot; aFile &quot;случайными&quot; числами:
rem (на самом деле создаются переменные aFile[1], aFile[2], ...)

rem тут должен был быть цикл, но приходится использовать GOTO из-за некоторой повторяемости %RANDOM%:
rem for /l %%i in (1,1,!nFileCount!) do 
set /a iFile = 0
:loopRandom
  call set /a nRandom = %%RANDOM%% %%%% !nFileTotal! + 1
  rem Проверка на повторение &quot;случайного&quot; числа в заполненной части aFile:
  for /l %%i in (1,1,!iFile!) do (
    if !aFile[%%i]! equ !nRandom! (
      echo.повтор: aFile[%%i]=!aFile[%%i]! == !nRandom!
      goto :loopRandom
    )
  )
  set /a iFile += 1
  set /a aFile[!iFile!]=!nRandom!
  echo.aFile[!iFile!]=!nRandom!
  if !iFile! lss !nFileCount! goto :loopRandom

rem сейчас в aFile содержится набор 3-х случайных целых чисел, соответствующих порядковым номерам файлов в папке.
rem например, для 5 TXT-файлов возможен такой набор: [5, 1, 3].
echo. 

rem ... перезаполнение aFile именами случайных файлов (по значениям в aFile):
set /a iFile = 0
for %%a in (*.txt) do (
  set /a iFile += 1
  rem просмотр aFile на значение nFileTotal и если найдено, то aFile[%%i] присваиваем имя соответствующего .txt-файла. 
  for /l %%i in (1,1,!nFileCount!) do (
    if !aFile[%%i]! equ !iFile! (
      set  &quot;aFile[%%i]=%%~a&quot;
      echo.&quot;aFile[%%i]=!aFile[%%i]!&quot;
    )
  )
)

rem сейчас в aFile содержатся имена 3-х файлов в папке.
rem например: [файл_05.txt, файл_01.txt, файл_03.txt].

rem -------------------------------------------------------------
rem 3.2. Склеивать данные и создавать новый файл с этими данными.
rem -------------------------------------------------------------
rem ... имя файла-результата (случайное временное имя):
set &quot;sFileRes=%~n0_%RANDOM%.tmp&quot;
echo. 

rem ... создание файла-результата:
for /l %%i in (1,1,!nFileCount!) do (

  rem ---------------------------------------------------------------------
  rem 1. В каждом файле оставить только 3 первых строки, остальные удалить.
  rem ---------------------------------------------------------------------
  set /a iLine = !nLineCount!
  for /f &quot;usebackq delims=&quot; %%A in (&quot;!aFile[%%i]!&quot;) do if !iLine! gtr 0 (

    rem ---------------------------------------------------------------------------------------------------------
    rem 2. В каждом файле оставить только ссылки. Цифры, которые расположены перед ссылками и символ &quot;;&quot; удалить.
    rem ---------------------------------------------------------------------------------------------------------
    for /f &quot;tokens=1,* delims=;&quot; %%a in (&quot;%%A&quot;) do (
      echo.%%b&gt;&gt;&quot;!sFileRes!&quot;
    )
    
    set /a iLine -= 1
  )
)

echo.Создан файл !sFileRes!. 

:End
pause
EndLocal
exit /b
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Wed, 23 Aug 2023 04:19:50 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159096#p159096</guid>
		</item>
		<item>
			<title><![CDATA[CMD/BAT: Батник на 3 простых действия]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159074#p159074</link>
			<description><![CDATA[<p>Здравствуйте. Есть вопрос, который не могу решить вот уже 3 дня, как ни пытался самостоятельно.</p><br /><p><strong>Исходные данные</strong><br />Есть каталог с файлами .txt. В каждом файле количество строк разное. Содержание каждого файла:</p><p>234324;Ссылка1<br />464565;Ссылка2<br />546456;Ссылка3<br />456456;Ссылка4<br />...<br />7899;СсылкаN</p><br /><p><strong>Что должен делать батник?</strong><br />1. В каждом файле оставить только 3 первых строки, остальные удалить.<br />2. В каждом файле оставить только ссылки. Цифры, которые расположены перед ссылками и символ &quot;;&quot; удалить<br />3. Выбирать рандомно при каждом запуске 3 файла, склеивать данные и создавать новый файл с этими данными.</p><br /><p><strong>Что должно получиться в итоге?</strong></p><p>При запуске батника должен получиться новый файл в таком виде:<br />Ссылка1<br />Ссылка2<br />Ссылка3</p><p>Ссылка4<br />Ссылка5<br />Ссылка6</p><p>Ссылка7<br />Ссылка8<br />Ссылка9</p><br /><br /><br /><p>Всем заранее благодарен за помощь ибо своих сил и знаний не хватает для реализации.</p>]]></description>
			<author><![CDATA[null@example.com (denisss)]]></author>
			<pubDate>Tue, 22 Aug 2023 08:09:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159074#p159074</guid>
		</item>
	</channel>
</rss>
