<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: (+JS) Скачиваем скрипты с GitHub Pages и патчим при этом]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=18619&amp;type=atom" />
	<updated>2026-09-04T16:27:41Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=18619</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: (+JS) Скачиваем скрипты с GitHub Pages и патчим при этом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=163506#p163506" />
			<content type="html"><![CDATA[<p>Там не ошибка с указанием кодировки, а сознательный шаг: решил придерживаться практики &quot;обучения на примерах&quot;, а именно, возникает задача, дополняю скрипт неким техническим решением, а потом не удаляю, чтобы видна была изначальная логика. Я вспомнил про гибридные скрипты (увидел впервые здесь), когда возникла задача при скачивании видео делать это максимально быстро с подстройкой под характеристики телевизора (очень старый Smart TV) и сюжет, скажем, если это подкаст/интервью, то незачем гнаться за высоким разрешением. В результате получилось удобное решение через гибридный скрипт. Потом smotrim выполнил редизайн сайта, а на GitHub (yt-dlp) произошли какие-то события (возможно борьба с вайбкодингом или &quot;санкции&quot; условно хактивистов), в общем все попытки контрибьютеров починить (две было) потерпели неудачу. А мой &quot;батник&quot; скачивает. Загрузил в Алису Про, она объясняет как всё работает, правда иногда меняя смысл на противоположный <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Но может, кто заинтересуется. Microsoft, вон VBS решило выпилить из Windows, а JS оставила, возможно, как раз из-за гибридных скриптов. Я у себя на GitHub публикую изменения и есть немногие, кому интересно. Насчёт CodePagesTestsDone: там логика была, что мы из всех разных вызовов проверку выполняем однократно, хотя да, лучше по-другому, наверно...</p>]]></content>
			<author>
				<name><![CDATA[kvk-2019]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=40485</uri>
			</author>
			<updated>2026-09-04T16:27:41Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=163506#p163506</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: (+JS) Скачиваем скрипты с GitHub Pages и патчим при этом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=163505#p163505" />
			<content type="html"><![CDATA[<p>О! Кто-то еще увлекается гибридными скриптами. Без иронии и сарказма - сам люблю их, но уже больше из спортивного интереса. Кажется выжал из этой темы все, что можно было.</p><p>Немного критики по вашему скрипту.</p><p>1. Ошибка внутри функции DosToWin:<br /></p><div class="codebox"><pre><code>[&quot;utf-8&quot; || DOS_codepage,</code></pre></div><p>наверно подразумевалось что-то одно: или только строковая константа, или операнды надо поменять местами. Скорее всего следующий код функции работает нормально потому, что в самом начале ваш скрипт переключается в utf-8 командой chcp 65001.</p><p>2. Кстати функция &quot;нечистая&quot; - она зависит не только от переданных параметров, но и от глобальной переменной. Лучше значение передавать явно, либо поменять логику. Обратите внимание на эту переменную:<br /></p><div class="codebox"><pre><code>CodePagesTestsDone</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2026-09-03T06:18:57Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=163505#p163505</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: (+JS) Скачиваем скрипты с GitHub Pages и патчим при этом]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=163504#p163504" />
			<content type="html"><![CDATA[<p>Я публиковал здесь уже гибридный CMD/JS скрипт для скачивания видео при помощи yt-dlp, теперь дополнил внешним .js скриптом по поиску уже просмотренного видео в базе данных истории файлов Windows 10. Понятно, что такой сценарий работы не каждому нужен и доступен, поэтому написал скрипт &quot;Обновить скрипты для скачивания видео.cmd&quot;, в котором по умолчанию отключил скачивание Search.js и пропатчил y.cmd, отключив соответствующие проверки (хотя и без этого всё работает корректно) и сменив заодно кодировку в нём (все мои скрипты в последнее время написаны и опубликованы в кодировке utf-8), вот текущая версия:<br /></p><div class="codebox"><pre><code>@set @x=0 /*
@echo off
chcp 65001 &gt;nul
.\yt-dlp.exe -U
call :update_script y.cmd /coding:Windows-1251 /rep:&quot;^(set test_prev_downloaded=)1$`$10;(^set extension=)\S+$`$1mp4&quot;
::call :update_script Search.js
exit /b
:update_script
del /f %1.bak 2&gt;nul
rename .\%1 %1.bak 2&gt;nul
curl.exe  --output .\%1 https://kvk-2015.github.io/%1
cscript /nologo /e:javascript &quot;%~dpnx0&quot; %*
goto:eof */

// Для скачанного скрипта можно выполнить патчинг согласно вашим предпочтениям

var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;), WshShell = new ActiveXObject(&quot;WScript.Shell&quot;), newText, CodePagesTestsDone = false, CodePages = [];
var str, coding = WSH.Arguments.Named.Item(&quot;coding&quot;), processing = [], pair, lineIndex, line, lines, splitter = &quot;`&quot;;

with(str = new ActiveXObject(&quot;ADODB.Stream&quot;)){Type = 2; Mode = 3;}

if(WSH.Arguments.Unnamed.Count &amp;&amp; (fso.FileExists(scriptName=WSH.Arguments.Unnamed(0)))){
    if(rep=WSH.Arguments.Named.Item(&quot;rep&quot;)){
        lines = rep.split(&quot;;&quot;);
        for(lineIndex in lines){
            pair = lines[lineIndex].split(splitter);
            if(pair.length != 2)WSH.echo(DosToWin(&quot;\r\nОшибка в правиле: &quot; + lines[lineIndex] + &quot; - между шаблоном поиска и замены должен быть разделитель &#039;&quot; + splitter + &quot;&#039;...\r\n&quot;));
            processing.push([new RegExp(pair[0]), pair[1]]);
        }
    }
    with(new ActiveXObject(&quot;ADODB.Stream&quot;)){Type=2; Mode=3;
        if(coding || processing){Open(); Charset=&quot;utf-8&quot;; LoadFromFile(scriptName); Position=0; newText=ReadText().replace(/\r\n|\n|\r/g, &quot;\r\n&quot;); Close();
            lines = newText.split(&quot;\r\n&quot;); newText = &quot;&quot;;
            for(lineIndex in lines){
                line = lines[lineIndex];
                for(var i=0; i&lt;processing.length; i++)line = line.replace(processing[i][0], processing[i][1]);
                newText += &quot;\r\n&quot; + line;
            }
            if(fso.FileExists(scriptName))fso.DeleteFile(scriptName);
            Open(); Charset=coding || &quot;utf-8&quot;; Position=0; WriteText(newText.slice(2)); SaveToFile(scriptName); Close();
        }
    }
}

function getCodepage(oExec){
    while(!oExec.Status || !oExec.StdOut.AtEndOfStream){
        var new_codepage = /^[\s\S]*(?:REG_SZ|:)\s+(\S+)\s*$/.test(oExec.StdOut.ReadAll()) ? RegExp.$1 : &quot;&quot;;
    }
    return new_codepage;
}

function getCodepageName(oExec){
    var commandHead = &#039;reg.exe query &quot;HKCR\\MIME\\Database\\Codepage\\&#039;, codepage, WebCharset;
    oExec = WshShell.Exec(commandHead + (codepage = getCodepage(oExec)) + &#039;&quot; -v BodyCharset&#039;); var tempCodepageName = getCodepage(oExec);
    oExec = WshShell.Exec(commandHead + codepage + &#039;&quot; -v WebCharset&#039;); return (WebCharset = getCodepage(oExec)) ? WebCharset : tempCodepageName;
}
function DosToWin(dosString){
    var result;
    if(!CodePagesTestsDone){
        var oExec = WshShell.Exec(&#039;cmd.exe /c chcp&#039;);   var DOS_codepage = getCodepageName(oExec);
        oExec = WshShell.Exec(&#039;reg.exe query &quot;HKLM\\SYSTEM\\CurrentControlSet\\Control\\Nls\\CodePage&quot; -v ACP&#039;);    var Windows_codepage = getCodepageName(oExec);
        if(DOS_codepage != Windows_codepage)CodePages = [&quot;utf-8&quot; || DOS_codepage, Windows_codepage];
        CodePagesTestsDone = true;
    }
    if(!CodePages.length)return dosString;
    with(str){
        Open();
        Charset = CodePages[1];
        WriteText(dosString);
        Position = 0;
        Charset = CodePages[0];
        result = ReadText();
        Close();
    }
    return result;
}
</code></pre></div><p>В общем, ещё пример использования гибридных CMD/JS скриптов. И здесь тоже обработка текста...</p>]]></content>
			<author>
				<name><![CDATA[kvk-2019]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=40485</uri>
			</author>
			<updated>2026-08-29T06:00:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=163504#p163504</id>
		</entry>
</feed>
