javascript в связке с бат-файлом: фоновый запуск

Для запуска в фоне батника можно воспользоваться следующим javascript-ом (сохраните данный код в файле с расширением *.js):

var WshShell, obj;
WshShell = WScript.CreateObject("WScript.Shell");
obj = WshShell.Run("c:\\test.bat", 0);
WshShell = null;

В методе Run укажите путь к вашему батнику, в нашем случае - c:\\test.bat. В мирных целях при решении задач по администрированию на Windows - платформах можно воспользоваться данной связкой, на рис. 1 приведен пример применения данной связки, когда с одной веб-странички интерактивно можно запускать батники.  
Рис. 1. Пример применения связки javascript - butch








Конечно, серьезно к этому относится не стоит, но может кому и сослужит доброе дело.

Функции в бат-файлах

Говорить о создании функции в бат-файле не совсем правильно, все-таки речь идет о батниках. Поэтому правильнее будет говорить об имитации. 
Для имитации функций и обращений к ним в bat-файлах можно воспользоваться такой
командой как call. Синтаксис в короткой форме выглядит следующим образом:
call [:метка [аргументы]]
Данная команда работает стеково (FILO): будучи вызванной первой в очереди вызовов в пакетном файле, извлекается последней. Как пример приведен батник, вычисляющий факториал числа.
________________
@echo off
call :factorial %1
echo %RESULT%
exit /b
rem Функция для подсчета значения факториала
rem Вход:
rem       %1 - Число, для которого необходимо подсчитать факториал
rem Выход:
rem       %RESULT% - Значение факториала
:factorial
if %1 == 0 (
    set RESULT=1
    exit /b
)
if %1 == 1 (
    set RESULT=1
    exit /b
)
set /a PARAM=%1 - 1
call :factorial %PARAM%
set /a RESULT=%1 * %RESULT%
exit /b
________________
На рисунках 1 и 2 рассмотрена работа данного скрипта и представлен подход к имитации понятия функций в butch-файлах.
Рис. 1. Работа батника, вычисляющего факториал числа
Рис. 2. Аналог функции в butch-файле
 При работе с командой call часто всплывает понятие стека (stack).

Переменные в бат-файле

Для создания переменных необходимо использовать команду set. Например.
@Echo off
Set /p ipadr1="Enter ip-adress 1:"
Set /p ipadr2="Enter ip-adress 2:"
ping %ipadr1%
ping %ipadr2%
Set ipadr1=
Set ipadr2=
pause
exit
Здесь в духе C/C++ в конце батника созданные переменные уничтожаются. Все-таки принципы необходимо соблюдать.

Циклы в бат-файле

 Здесь приведены примеры организации цикла в батнике.
________________
@echo off
rem Включение расширенной обработки команд
setlocal enabledelayedexpansion
rem Инициализация переменной i (счетчик)
set /a i=0
rem Метка условия выполнения цикла
:if
if %i% LSS 10 (
    goto count
) else (
    goto end
)
rem Функциональная метка, содержащая выполнимые команды с последующим заполнением счетчика i
:count
echo Hello world!
set /a i=i+1
goto if
rem Финишная метка
:end
echo Loop finished...
pause
exit
________________
Можно внести небольшую интерактивность, например предоставив возможность выбора условий окончания цикла
________________
@echo off
rem Включение расширенной обработки команд
setlocal enabledelayedexpansion
rem Инициализация переменной i (счетчик)
set /a i=0
set /p n=Enter border
rem Метка условия выполнения цикла
:if
if %i% LSS %n% (
    goto count
) else (
    goto end
)
rem Функциональная метка, содержащая выполнимые команды с последующим заполнением счетчика i
:count
echo Hello world!
set /a i=i+1
goto if
rem Финишная метка
:end
echo Loop finished...
pause
exit /b
________________
Циклы удобны в практических целях, например:
________________
@echo off
rem Включение расширенной обработки команд
setlocal enabledelayedexpansion
rem Инициализация переменной i (счетчик)
set /a i=0
set /p n=Enter border
rem Метка условия выполнения цикла
:if
if %i% LSS %n% (
    goto count
) else (
    goto end
)
rem Функциональная метка, содержащая выполнимые команды с последующим заполнением счетчика i
:count
set /a i=i+1
ping 191.168.0.%i% -n 1
goto if
rem Финишная метка
:end
echo Loop finished...
pause
exit /b

Трансферизация данных в формате *.xls, *.xlsx, and *.xlsb в базы данных

Возможно, кто-то встречался с ошибкой вида:
 
Ошибка разбора файла: The 'Microsoft.ACE.OLEDB.12.0' provider is not registered 
on the local machine.
 
В нашем случае ошибка возникала при попытке произвести импорт данных в формате  
*.xls в базу данных Oracle.
 
Интерфейсом работы с базой данных служило веб-приложение построенное на технологии 
ASP.NET.
 
Решением проблемы был компонент AccessDatabaseEngine.exe
 
Смело устанавливайте данный компонент, не смотря на версию установленного пакета офиса. 
 
 Удачи Вам. 

Задача на сортировку на C++

Задача. На C++ реализовать ввод массива из пяти целых чисел. Вывести полученный массив. Произвести поиск минимального и максимального элементов. Провести сортировку: заменить местами только те элементы в массиве, которые лежат в диапазоне от минимального до максимального. Далее вывести полученный результат.
Решение. Реализовано на Microsoft Visual C++ 2008 Express Edition
#include <iostream>
using namespace std;

//Ввод значений в массив arr
void InputArray(int arr[])
{
cout << "Enter any 5 numbers" << endl;
for(int i = 0; i < 5; i++)
    cin >> arr[i];
}

//Вывод значений массива
void PrintArray(int arr[])
{
cout << endl;
for(int i = 0; i < 5; i++)
    cout << arr[i] <<" ";
}

//Поиск индекса минимального значения в массиве arr
int FindMin(int arr[])
{
int i_min = 0;
int min = arr[0];
for(int i = 0; i < 5; i++)
    if(arr[i] < min)
    {
        i_min = i;
        min = arr[i];
    }
return i_min;
}

//Поиск индекса максимального значения в массиве arr
int FindMax(int arr[])
{
int i_max = 0;
int max = arr[0];
for(int i = 0; i < 5; i++)
    if(arr[i] > max)
    {
        i_max = i;
        max = arr[i];
    }

return i_max;
}

//Замена местами значений в массиве arr в пределах от минимального до максимального значения
//Рассмотрены два случая
void SortArray(int a, int b, int arr[])
{
if(a < b)
{
    for (int i = a; i < b; i++)
           {
           int tmp = arr[b];
           arr[b] = arr[i];
           arr[i] = tmp;
           b--;
           }
}
if(a > b)
{
    for (int i = a; i > b; i--)
       {
       int tmp = arr[b];
       arr[b] = arr[i];
       arr[i] = tmp;
       b++;
       }
}
}

int main(){

int arr[5];

int a, b;

InputArray(arr);

PrintArray(arr);

//Искомые индексы минимального и максимального значений в массиве arr
a = FindMin(arr);
b = FindMax(arr);

SortArray(a, b, arr);

PrintArray(arr);

return 0;
}

 На выходе получаем следующее. Работает.