Тема: CMD/BAT: (+JS) Скачиваем скрипты с GitHub Pages и патчим при этом
Я публиковал здесь уже гибридный CMD/JS скрипт для скачивания видео при помощи yt-dlp, теперь дополнил внешним .js скриптом по поиску уже просмотренного видео в базе данных истории файлов Windows 10. Понятно, что такой сценарий работы не каждому нужен и доступен, поэтому написал скрипт "Обновить скрипты для скачивания видео.cmd", в котором по умолчанию отключил скачивание Search.js и пропатчил y.cmd, отключив соответствующие проверки (хотя и без этого всё работает корректно) и сменив заодно кодировку в нём (все мои скрипты в последнее время написаны и опубликованы в кодировке utf-8), вот текущая версия:
@set @x=0 /*
@echo off
chcp 65001 >nul
.\yt-dlp.exe -U
call :update_script y.cmd /coding:Windows-1251 /rep:"^(set test_prev_downloaded=)1$`$10;(^set extension=)\S+$`$1mp4"
::call :update_script Search.js
exit /b
:update_script
del /f %1.bak 2>nul
rename .\%1 %1.bak 2>nul
curl.exe --output .\%1 https://kvk-2015.github.io/%1
cscript /nologo /e:javascript "%~dpnx0" %*
goto:eof */
// Для скачанного скрипта можно выполнить патчинг согласно вашим предпочтениям
var fso = new ActiveXObject("Scripting.FileSystemObject"), WshShell = new ActiveXObject("WScript.Shell"), newText, CodePagesTestsDone = false, CodePages = [];
var str, coding = WSH.Arguments.Named.Item("coding"), processing = [], pair, lineIndex, line, lines, splitter = "`";
with(str = new ActiveXObject("ADODB.Stream")){Type = 2; Mode = 3;}
if(WSH.Arguments.Unnamed.Count && (fso.FileExists(scriptName=WSH.Arguments.Unnamed(0)))){
if(rep=WSH.Arguments.Named.Item("rep")){
lines = rep.split(";");
for(lineIndex in lines){
pair = lines[lineIndex].split(splitter);
if(pair.length != 2)WSH.echo(DosToWin("\r\nОшибка в правиле: " + lines[lineIndex] + " - между шаблоном поиска и замены должен быть разделитель '" + splitter + "'...\r\n"));
processing.push([new RegExp(pair[0]), pair[1]]);
}
}
with(new ActiveXObject("ADODB.Stream")){Type=2; Mode=3;
if(coding || processing){Open(); Charset="utf-8"; LoadFromFile(scriptName); Position=0; newText=ReadText().replace(/\r\n|\n|\r/g, "\r\n"); Close();
lines = newText.split("\r\n"); newText = "";
for(lineIndex in lines){
line = lines[lineIndex];
for(var i=0; i<processing.length; i++)line = line.replace(processing[i][0], processing[i][1]);
newText += "\r\n" + line;
}
if(fso.FileExists(scriptName))fso.DeleteFile(scriptName);
Open(); Charset=coding || "utf-8"; 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 : "";
}
return new_codepage;
}
function getCodepageName(oExec){
var commandHead = 'reg.exe query "HKCR\\MIME\\Database\\Codepage\\', codepage, WebCharset;
oExec = WshShell.Exec(commandHead + (codepage = getCodepage(oExec)) + '" -v BodyCharset'); var tempCodepageName = getCodepage(oExec);
oExec = WshShell.Exec(commandHead + codepage + '" -v WebCharset'); return (WebCharset = getCodepage(oExec)) ? WebCharset : tempCodepageName;
}
function DosToWin(dosString){
var result;
if(!CodePagesTestsDone){
var oExec = WshShell.Exec('cmd.exe /c chcp'); var DOS_codepage = getCodepageName(oExec);
oExec = WshShell.Exec('reg.exe query "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Nls\\CodePage" -v ACP'); var Windows_codepage = getCodepageName(oExec);
if(DOS_codepage != Windows_codepage)CodePages = ["utf-8" || 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;
}
В общем, ещё пример использования гибридных CMD/JS скриптов. И здесь тоже обработка текста...

