Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии: bat, cmd

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

Открыть новую тему     Написать ответ в эту тему

Maz



Дед Мазай
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Командная строка, батники\сценарии (bat, cmd)
часть 1 | часть 2 | часть 3 | часть 4 | часть 5 | часть 6
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.

Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Примечание: Большие куски кода заключайте в тэг [ more ].  

Смежные темы:
В помощь системному администратору > Автоматизация администрирования
Microsoft Windows > Сценарии Windows

Полезные ссылки:
· Из Windows XP Professional Product Documentation:
> Описание Cmd.exe > Command shell overview
> Using batch files > Using batch parameters > Using filters > Using command redirection operators
 
· Уроки bat-аники (для начинающих): первый и второй
· Курс из 19 лекций "Командная строка и сценарии Windows"
· Уильям Р. Станек - Командная строка Windows. Справочник администратора
 
· Выполнение BAT-скриптов без вызова окна консоли
· cmdow - изменение параметров и видимости дос-окна, Статья в КОМПЬЮТЕРРАONLINE
· Набор GNU утилит для win32
· HS_Packet.7z - Пакет утилит для организации интерфейса в bat-файлах
· blat - отправка почты из консоли
· Easy Batch Builder+Rus+Crack - Редактор BAT файлов.Через графический интерфейс программы вы сможете быстро конструировать пакетные файлы практически любой сложности. (В комплекте есть Лоадер созданный с помощью Sign Of Misery некоторые антивирусы обзывают его вирусом. Вам решать: ставить или не ставить) (ЗЕРКАЛО)
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек) ещё и ещё
· Переход из 32-битной версии cmd.exe в 64-битную (1) (2)(3)
 
· Архив всевозможных версий cmd.exe (от Windows NT 3.10 до Windows 11 +Win95cmd +ReactOS) и command.com (DOS 5.0 и выше). Старые командные процессоры можно запускать на более новых ОС, хотя не всё может работать корректно. Подробная документация по командам cmd.exe и стандартным утилитам ОС для NT 3.51, NT 5.0 (Windows 2000) и NT 5.2 (Windows Server 2003). Сборник представляет исторический интерес, а также незаменим для тех, у кого появилось желание сделать свои скрипты работоспобными не только на своей версии ОС.
 
· Большой сборник одним архивом: Сотни Win32 утилит командной строки, нетривиальные .cmd файлы, .bat miniperl скрипты (не требующие полноценной установки Perl), FAR Manager с плагинами и настройками, разное для DOS/DOSBox (откуда под Win32 интерес представляют три продвинутых "мультисистемных" .bat файла да ещё, может быть, оболочка Necromancer DOS Navigator с поддержкой LFN и доступом к буферу обмена Windows). Краткие описания всего - в файликах files.bbs

Всего записей: 39180 | Зарегистр. 26-02-2002 | Отправлено: 22:41 20-06-2024 | Исправлено: Maz, 21:52 28-09-2024
shok

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO

Цитата:
А чё не на C#?..

 

Код:
C#
 
using System;
using System.Collections.Generic;
 
class Program
{
    static void Main()
    {
        // Установка переменных
        int fileCount = 3;
        List<string> files = new List<string>
        {
            @"x:\Any folder\Any File.bin",
            @"y:\Any other folder\Any File.txt",
            @"z:\Any folder\Any File.mp4"
        };
 
        // Вывод списка файлов
        for (int i = 0; i < fileCount; i++)
        {
            Console.WriteLine($"{i + 1}. {files[i]}");
        }
 
        // Запрос ввода от пользователя
        while (true)
        {
            Console.Write("Enter file number (empty to Cancel): ");
            string input = Console.ReadLine();
 
            if (string.IsNullOrEmpty(input))
            {
                Console.WriteLine("Cancelled.");
                break;
            }
 
            if (int.TryParse(input, out int fileNumber) && fileNumber > 0 && fileNumber <= fileCount)
            {
                string selectedFile = files[fileNumber - 1];
                Console.WriteLine($"You selected: {selectedFile}");
                // Здесь можно добавить код для обработки выбранного файла
                break;
            }
            else
            {
                Console.WriteLine($"Invalid input. Please enter a number between 1 and {fileCount}.");
            }
        }
    }
}

Всего записей: 11955 | Зарегистр. 30-04-2006 | Отправлено: 21:30 25-08-2024 | Исправлено: shok, 21:33 25-08-2024
Crownethers

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
virjokk
GCRaistlin
shok
Спасибо огромное! Беру все.
В самом деле огромное спасибо - это же все готовые блоки для интерактивных батников, а не просто односложные команды. Поэтому записываю в тетрадь все оптом.  
PS - тоже в копилку, поскольку все, что можно засунуть в батник (без установки сторонних движков) - мне подходит (тем более он работает на старых версиях ps).
shok
На PascalScript подошло бы, если еще и движок компактный к нему найти

Всего записей: 7 | Зарегистр. 10-01-2024 | Отправлено: 22:03 25-08-2024 | Исправлено: Crownethers, 22:07 25-08-2024
shok

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Crownethers

Цитата:
На PascalScript подошло бы, если еще и движок компактный к нему найти

 
как-то так:

Код:
program FileSelection;
 
var
  fileCount: Integer;
  files: array[1..3] of String;
  i: Integer;
  prompt: String;
  selectedFile: String;
 
begin
  // Установка переменных
  fileCount := 3;
  files[1] := 'x:\Any folder\Any File.bin';
  files[2] := 'y:\Any other folder\Any File.txt';
  files[3] := 'z:\Any folder\Any File.mp4';
 
  // Вывод списка файлов
  for i := 1 to fileCount do
  begin
    WriteLn(i, '. ', files[i]);
  end;
 
  // Запрос ввода от пользователя
  repeat
    Write('Enter file number (empty to Cancel): ');
    ReadLn(prompt);
 
    if prompt = '' then
    begin
      WriteLn('Cancelled.');
      Exit;
    end
    else if (StrToIntDef(prompt, 0) > 0) and (StrToIntDef(prompt, 0) <= fileCount) then
    begin
      selectedFile := files[StrToInt(prompt)];
      WriteLn('You selected: ', selectedFile);
      // Здесь можно добавить код для обработки выбранного файла
      Break;
    end
    else
    begin
      WriteLn('Invalid input. Please enter a number between 1 and ', fileCount, '.');
    end;
  until False;
end.

Всего записей: 11955 | Зарегистр. 30-04-2006 | Отправлено: 23:11 25-08-2024
Crownethers

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
shok
Превосходно.
Вы мастер-универсал.
Но я же говорю, что движка/интерпретатора нет компактного у меня

Всего записей: 7 | Зарегистр. 10-01-2024 | Отправлено: 05:42 26-08-2024
dedulya68



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Случайно потёр батник, который через robocopy создавал копию профиля браузера со счётчиком. Может кто навояет.

Всего записей: 1005 | Зарегистр. 22-12-2016 | Отправлено: 10:45 06-09-2024
virjokk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Запускать в папке, где профиль. Имя профиля и путь\имя копии подставить свои:

Код:
@echo off
for /f %%a in ('dir /b /a:d profile* 2^> nul ^| find "" /v /c') do set /a n=%%a+1
if not exist profile%n%\ robocopy profile profile%n% /E

Всего записей: 360 | Зарегистр. 19-05-2006 | Отправлено: 14:50 06-09-2024
dedulya68



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
virjokk (пост)
Цитата:
Код:

Работает,спасибо. Но хотелось бы запуск из любого места с указанием путей.
Спасибо.

Всего записей: 1005 | Зарегистр. 22-12-2016 | Отправлено: 15:14 06-09-2024 | Исправлено: dedulya68, 16:11 06-09-2024
virjokk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
с указанием путей

Путь указать в качестве параметра батника без финального слэша:
Код:
@echo off
for /f %%a in ('dir /b /a:d %~1\profile* 2^> nul ^| find "" /v /c') do set /a n=%%a+1
if not exist %~1\profile%n%\ robocopy %~1\profile %~1\profile%n% /E
 

Всего записей: 360 | Зарегистр. 19-05-2006 | Отправлено: 15:54 06-09-2024
Crownethers

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня еще вопрос, непростой. Может быть, такое и невозможно.
Задача состоит в том, чтобы задать параметры окна консоли, в зависимости от разрешения экрана  и сделать это автоматом (то есть, запускается некий батник, и прежде, чем он что-то начнет выводить в консоль, сама эта консоль им настраивается для, условно говоря, комфортного отображения последующей информации). Настройка - однократная, при запуске батника. Используется только для самого батника, сохранять в системе настройки не требуется. Настройки консоли жестко фиксированы под разрешения экрана.
Рарешения экрана (по ширине):
менее 1920,
1920
более 1920
Настройки консоли:
- число символов в строке (напр. 80, 120, 140 - под каждое разрешение одно)
- шрифт - один на все случаи (задается)
- размер шрифта - по одному на разрешение (всего три)
- Число линий - фиксированное, например., 36 или по высоте экрана.
- Размер экранного буфера - чтобы можно было вывести на экран максимум информации с прокруткой - один, по максимуму - 32566 (x7FFE) или сколько возможно.
- Строки не переносить (горизонтальная прокрутка).
Ориентироваться на возможности Win7 - что бы и на семерке работало.

Всего записей: 7 | Зарегистр. 10-01-2024 | Отправлено: 05:23 07-09-2024
BorlandIMHO

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Crownethers

Цитата:
число символов в строке (напр. 80, 120, 140 - под каждое разрешение одно)
...
- Строки не переносить (горизонтальная прокрутка).

Параметр "cols=" команды mode con задаёт количество символов в строке (колонок) консоли, прокрутка окна по горизонтали включается автоматически, если при текущем разрешении экрана и размере шрифта запрошенное количество колонок не умещается в окне консоли. Перенос строк срабатывает автоматически, если длина строки превышает количество колонок, повлиять на это вы не можете никак.

Цитата:
шрифт
- размер шрифта

Задаётся в свойствах окна консоли, текущей либо "по умолчанию" (для всех консольных окон, для которых не задан явно другой в их ярлыке запуска). Штатных средств изменить его изнутри запущенной консоли нет, насколько я знаю.  

Цитата:
- Число линий
- Размер экранного буфера

Параметр "lines=" команды mode con задаёт количество строк в буфере консоли, прокрутка окна по вертикали включается автоматически, если при текущем разрешении экрана и размере шрифта запрошенное количество строк не умещается в окне консоли.
 
Штатных способов изменения положения/размеров консольного окна изнутри самого окна (консоли) нет, насколько мне известно {разве что автоподстройка ширины/высоты окна в случае если заданные cols/lines полностью влезают в окно}. Собственно консоль - отдельно, окно, в котором она отображается - отдельно.

Всего записей: 2811 | Зарегистр. 12-10-2006 | Отправлено: 10:33 08-09-2024 | Исправлено: BorlandIMHO, 11:09 08-09-2024
shok

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Crownethers
как-то так
 

Код:
@echo off
setlocal
 
:: Определение разрешения экрана
for /f "tokens=2 delims== " %%a in ('wmic desktopmonitor get screenwidth /value') do set "ScreenWidth=%%a"
for /f "tokens=2 delims== " %%b in ('wmic desktopmonitor get screenheight /value') do set "ScreenHeight=%%b"
 
:: Определение категории разрешения
if %ScreenWidth% LSS 1920 (
    set "ResolutionCategory=LessThan1920"
) else if %ScreenWidth% EQU 1920 (
    set "ResolutionCategory=1920"
) else (
    set "ResolutionCategory=MoreThan1920"
)
 
:: Настройка параметров консоли
if "%ResolutionCategory%"=="LessThan1920" (
    mode con: cols=80 lines=36
    mode con: cp select=437
    mode con: lines=36
) else if "%ResolutionCategory%"=="1920" (
    mode con: cols=120 lines=36
    mode con: cp select=437
    mode con: lines=36
) else (
    mode con: cols=140 lines=36
    mode con: cp select=437
    mode con: lines=36
)
 
:: Запуск вашего батника (здесь можно добавить свои команды)
echo Настройка консоли завершена!
pause

Всего записей: 11955 | Зарегистр. 30-04-2006 | Отправлено: 11:18 08-09-2024
Inoz2000



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в зависимости от версии винды, wmic команды нужны разные.
wmic path Win32_VideoController get CurrentHorizontalResolution /value
wmic path Win32_VideoController get CurrentVerticalResolution /value

Всего записей: 5349 | Зарегистр. 23-04-2009 | Отправлено: 11:31 08-09-2024
shok

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
можно так попробовать
 

Код:
 
@echo off
setlocal
 
:: Определение разрешения экрана
for /f "tokens=2 delims== " %%a in ('wmic path Win32_VideoController get CurrentHorizontalResolution /value') do set "ScreenWidth=%%a"
for /f "tokens=2 delims== " %%b in ('wmic path Win32_VideoController get CurrentVerticalResolution /value') do set "ScreenHeight=%%b"
 
:: Определение категории разрешения
if %ScreenWidth% LSS 1920 (
    set "ResolutionCategory=LessThan1920"
) else if %ScreenWidth% EQU 1920 (
    set "ResolutionCategory=1920"
) else (
    set "ResolutionCategory=MoreThan1920"
)
 
:: Настройка параметров консоли
if "%ResolutionCategory%"=="LessThan1920" (
    mode con: cols=80 lines=36
    mode con: cp select=437
    mode con: lines=36
) else if "%ResolutionCategory%"=="1920" (
    mode con: cols=120 lines=36
    mode con: cp select=437
    mode con: lines=36
) else (
    mode con: cols=140 lines=36
    mode con: cp select=437
    mode con: lines=36
)
 
:: Запуск вашего батника (здесь можно добавить свои команды)
echo Настройка консоли завершена!
pause
 

 
на 11-й винде работает этот вариант.  
 
это более универсальный вариант:

Код:
 
@echo off
setlocal
 
:: Определение разрешения экрана через wmic desktopmonitor
for /f "tokens=2 delims== " %%a in ('wmic desktopmonitor get screenwidth /value') do set "ScreenWidth=%%a"
for /f "tokens=2 delims== " %%b in ('wmic desktopmonitor get screenheight /value') do set "ScreenHeight=%%b"
 
:: Если не удалось получить разрешение через wmic desktopmonitor, пробуем через wmic path Win32_VideoController
if "%ScreenWidth%"=="" (
    for /f "tokens=2 delims== " %%a in ('wmic path Win32_VideoController get CurrentHorizontalResolution /value') do set "ScreenWidth=%%a"
    for /f "tokens=2 delims== " %%b in ('wmic path Win32_VideoController get CurrentVerticalResolution /value') do set "ScreenHeight=%%b"
)
 
:: Определение категории разрешения
if %ScreenWidth% LSS 1920 (
    set "ResolutionCategory=LessThan1920"
) else if %ScreenWidth% EQU 1920 (
    set "ResolutionCategory=1920"
) else (
    set "ResolutionCategory=MoreThan1920"
)
 
:: Настройка параметров консоли
if "%ResolutionCategory%"=="LessThan1920" (
    mode con: cols=80 lines=36
    mode con: cp select=437
    mode con: lines=36
) else if "%ResolutionCategory%"=="1920" (
    mode con: cols=120 lines=36
    mode con: cp select=437
    mode con: lines=36
) else (
    mode con: cols=140 lines=36
    mode con: cp select=437
    mode con: lines=36
)
 
:: Запуск вашего батника (здесь можно добавить свои команды)
echo Настройка консоли завершена!
pause
 
 

 

Всего записей: 11955 | Зарегистр. 30-04-2006 | Отправлено: 11:37 08-09-2024 | Исправлено: shok, 12:47 08-09-2024
Artem_Butenko



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята, пожалуйста подскажите, каким образом получить имя каталога из которого запущен пакетный сценарий в переменную. Просто имя каталога, без слэшей.
Можно еще уточнить, как наиболее лаконично запретить исполнение сценария по двойному клику, если он (сценарий) работает с переданными параметрами, например, Script.cmd Par1 Par2 Par3 (%1, %2, %3 и т.д.).
 
По первому вопросу нашёл решение. Только, насколько оно корректное?

Всего записей: 728 | Зарегистр. 19-02-2008 | Отправлено: 05:50 14-09-2024 | Исправлено: Artem_Butenko, 06:12 14-09-2024
www_world

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Artem_Butenko
1.
FOR /F "delims=" %%i IN ('echo %cd%') DO ECHO %%~nxi
вместо ECHO - то, что вы хотите делать - set и т.д.
2..
IF %1=="" GOTO :eof
Можете для всех параметров это повторить, чтобы гарантированно все присутствовали при выполнении батника

Всего записей: 501 | Зарегистр. 04-11-2018 | Отправлено: 07:30 14-09-2024
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
www_world
1. Этот способ, во-первых, тормозной, во-вторых, может дать некорректный результат при включеном delayed expansion.

Код:
 
if _==_!! (
  echo Current directory is !cd!
) else (
  for /f delims^= %%A in ("%cd%") do echo Current directory is %%A
)
 

2. Достаточно проверить последний обязательный параметр. Например, если таковых четыре:

Код:
 
set LastMandatoryArg=%4
if not defined LastMandatoryArg (
  echo Syntax error.
  exit /b 1
)
 

 
Artem_Butenko
1. NB: возвращается имя текущего каталога. То есть делать это нужно до его возможной смены в скрипте.

----------
Magically yours
Raistlin

Всего записей: 4174 | Зарегистр. 18-04-2005 | Отправлено: 09:27 14-09-2024
shok

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
@echo off
REM Получаем полный путь к каталогу, где находится скрипт, включая завершающий слэш
set "script_dir=%~dp0"
 
REM Удаляем завершающий слэш из пути
set "script_dir=%script_dir:~0,-1%"
 
REM Извлекаем только имя каталога из полного пути
for %%I in ("%script_dir%") do set "dir_name=%%~nxI"
 
REM Выводим имя каталога
echo %dir_name%

Всего записей: 11955 | Зарегистр. 30-04-2006 | Отправлено: 09:48 14-09-2024
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Artem_Butenko
Вариант через call:

Цитата:
@echo off
call :GetCmdDir "%~dp0."
echo %CmdDir%
................ ваш код ..............
goto :eof
 
:GetCmdDir
set "CmdDir=%~nx1"
goto :eof
 

 
Добавлено:
shok

Цитата:
REM Удаляем завершающий слэш из пути

Это ни к чему, вроде как %~nx так и делает. Просто надо добавить точку.

Всего записей: 12925 | Зарегистр. 11-03-2002 | Отправлено: 09:49 14-09-2024 | Исправлено: Pasha_ZZZ, 09:52 14-09-2024
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
shok
Pasha_ZZZ
Каталог, из которого запущен скрипт, и каталог, в котором находится скрипт, - не одно и то же в общем случае.
 
shok

Цитата:
REM Удаляем завершающий слэш из пути

Если путь - к корневому каталогу, получите не то, что хотели.

----------
Magically yours
Raistlin

Всего записей: 4174 | Зарегистр. 18-04-2005 | Отправлено: 09:57 14-09-2024
shok

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
В таком случае:
@echo off
REM Получаем текущий рабочий каталог, из которого запущен скрипт
set "current_dir=%cd%"
 
REM Извлекаем только имя текущего каталога
for %%I in ("%current_dir%") do set "dir_name=%%~nxI"
 
REM Выводим имя текущего каталога
echo %dir_name%
pause

Всего записей: 11955 | Зарегистр. 30-04-2006 | Отправлено: 10:19 14-09-2024
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии: bat, cmd


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru

Рейтинг.ru