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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13

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

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

Всего записей: 39021 | Зарегистр. 26-02-2002 | Отправлено: 22:41 20-06-2024
LZAA

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
 
                                      Simple Code
 
     Я немного изменил код. Теперь такой:
 
         powershell -WindowStyle Hidden start -NNW 'Path'
 
    Есть ли алиас для 'WindowStyle'? Я методом тыка перебрал несколько вариантов сокращения, но рабочего не нашёл.

Всего записей: 2286 | Зарегистр. 09-01-2010 | Отправлено: 17:39 23-08-2024
Simple Code

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

Цитата:
Есть ли алиас для 'WindowStyle'?

Вроде нет сокращений для этого параметра. Алиасы можно посмотреть командой Get-Alias.
Сокращения для параметров не знаю где смотреть, читал что powershell понимает логические сокращения для некоторых параметров, например -ExecutionPolicy Bypass сокращаем до -ep bp.
И обратите внимание, что параметры NoNewWindow и WindowStyle нельзя использовать в той же команде, выскачет ошибка.

Всего записей: 202 | Зарегистр. 19-11-2022 | Отправлено: 01:45 24-08-2024
Pasha_ZZZ



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

Цитата:
Есть ли алиас для 'WindowStyle'?

-w

Всего записей: 12699 | Зарегистр. 11-03-2002 | Отправлено: 09:46 24-08-2024
LZAA

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

                                Simple Code
 
       Я 'Power Shell' почти не пользуюсь, поэтому мало в нём разбираюсь.
    С Вашей подачи решил немного с 'Alias' разобраться. Много интересного и странного обнаружил.
 
      1. 'Get-Alias'.
           В списке 'NNW -> NoNewWindow' отсутствует, но это работает. Получается так, что есть два разных инструмента - псевдоним и сокращение команды. Неплохо было бы найти список допустимых сокращений.
          Псевдоним 'WS' можно создать, но возможность 'из коробки' удобнее.
      2. Не проверял с 'powershell.exe', но в пакетном файле команда
 
         powershell -WindowStyle Hidden start -NNW 'Path'
 
         корректно работает.
 
                            Pasha_ZZZ
 
        Команда
 
         powershell -w Hidden start -NNW 'Path'
 
        тоже корректно работает. Такой вопрос: если это псевдоним, то почему его нет в 'Get-Alias'? А если это - допустимое сокращение, то есть ли эта информация в Net?

Всего записей: 2286 | Зарегистр. 09-01-2010 | Отправлено: 10:27 24-08-2024
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
LZAA
https://github.com/PowerShell/PowerShell/blob/5bcda5d060fc3b5dbe1ae59a4eeae9794813c8eb/src/Microsoft.PowerShell.ConsoleHost/host/msh/CommandLineParameterParser.cs#L204

Всего записей: 12699 | Зарегистр. 11-03-2002 | Отправлено: 10:34 24-08-2024
LZAA

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
   OK. Буду знать.
 
    Код:
 
    powershell -NoLogo -NoProfile -NonInteractive -InputFormat None -ExecutionPolicy Bypass -Command "Start-Process -FilePath .\my-program -NoNewWindow"  
 
   тоже работает. Вначале у меня не работало, потому что вместо *.\my-program* я использовал *"Path"*. С *'Path'* код работает.
 

Всего записей: 2286 | Зарегистр. 09-01-2010 | Отправлено: 10:41 24-08-2024 | Исправлено: LZAA, 11:03 24-08-2024
Jonmey

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LZAA
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_pwsh?view=powershell-7.4

Всего записей: 1365 | Зарегистр. 17-01-2011 | Отправлено: 10:41 24-08-2024
Simple Code

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

Цитата:
      2. Не проверял с 'powershell.exe', но в пакетном файле команда
 
         powershell -WindowStyle Hidden start -NNW 'Path'
 
         корректно работает.

Так будет работать: powershell -w Hidden start -NNW 'Path', т.к. скрываете окно консоли.
Так не будет работать: powershell start -w Hidden -NNW 'Path', вот про этот момент я писал, в данном случаи эти параметры -NNW и -W нельзя использовать вместе.

Всего записей: 202 | Зарегистр. 19-11-2022 | Отправлено: 12:08 24-08-2024
BorlandIMHO

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

Цитата:
Так работать не будет: сначала раскроется %a%.

Ну, именно так - будет только непосредственно в командной строке.
А вот так оно будет в скрипте (позволил себе взять за основу ваш код, для скорости):

Код:
set A1=one
set A2=two
set A3=three
set B1=eins
set B2=zwei
set B3=drei
for /l %%I in (1,1,3) do (
  call echo "%%A%%I%%" = "%%B%%I%%"
)
pause


setlocal - штука полезная, но в данной задаче без неё, в принципе, можно обойтись.

Всего записей: 2559 | Зарегистр. 12-10-2006 | Отправлено: 18:00 24-08-2024
GCRaistlin



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

Цитата:
setlocal - штука полезная, но в данной задаче без неё, в принципе, можно обойтись

Непонятно только зачем. Такое применение CALL - это тормозной костыль.

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

Всего записей: 4091 | Зарегистр. 18-04-2005 | Отправлено: 19:08 24-08-2024
BorlandIMHO

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

Цитата:
Такое применение CALL - это тормозной костыль.

Согласен, но вообще-то в постановке задачи
Цитата:
передав три переменные в подпрограмму
присутствовало "call :sub" в явном виде.
Отсюда и {call :sub "%%A%%I%%"  "%%B%%I%%" "%%C%%I%%"}.

Всего записей: 2559 | Зарегистр. 12-10-2006 | Отправлено: 20:54 24-08-2024
GCRaistlin



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

Цитата:
вообще-то в постановке задачи ... присутствовало "call :sub" в явном виде

Не совсем так. Вопрос был:

Цитата:
существует ли способ обработать эти ряды в цикле, напр., через for передав три переменные в подпрограмму

В сущности, речь идет о работе с массивом.

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

Всего записей: 4091 | Зарегистр. 18-04-2005 | Отправлено: 21:12 24-08-2024 | Исправлено: GCRaistlin, 21:13 24-08-2024
Crownethers

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GCRaistlin
BorlandIMHO
Огромное спасибо!
Именно вашими советами я и воспользовался.
 
Передача трех переменных в подпрограмму в цикле

Код:
set "A0=one.txt"
set "B0=two two"
set "C0=three three"
set "A1=four.txt"
set "B1=five five"
set "C1=six six"
set "A2=seven.txt"
set "B2=eigth eigth"
set "C2=nine nine"
 
for /l %%I in (0,1,2) do call :sub "%%A%%I%%" "%%B%%I%%" "%%C%%I%%"
goto :eof
 
:sub
echo %~1
echo %~2
echo %~3
goto :eof

Всего записей: 7 | Зарегистр. 10-01-2024 | Отправлено: 23:36 24-08-2024
Crownethers

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще вопрос.
Получаем список текстовых файлов, содержащих строку, напр., так (необязательно именно так - может есть и оптимальнее способ):
for /f "delims=" %%f in ('findstr /m /c:"some string" *.txt') do ...
a дальше требуется вывести этот список на экран (если файлов больше одного, чаще всего два, но точно не больше девяти) таким образом, чтобы можно выбрать любой из них просто вставив цифру (0 -ничего, 1- файл1 и т.д.).
Возможно такое осуществить (через choice или еще как-нибудь)?

Всего записей: 7 | Зарегистр. 10-01-2024 | Отправлено: 08:51 25-08-2024
BorlandIMHO

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

Цитата:
Возможно такое осуществить (через choice

Если вы в процессе формирования списка файлов подсчитываете их количество и список файлов в "массиве"- то да, можно.

Код:
@echo OFF
REM Количество пунктов для выбора (файлов) и их список, как вы это формируете - ваше дело, здесь заданы явно
set /A FILECOUNT=3
set "FILE1=x:\Any folder\Any File.bin"
set "FILE2=y:\Any other folder\Any File.txt"
set "FILE3=z:\Any folder\Any File.mp4"
set CHOICEPRMPT=0
REM собственно код
setlocal ENABLEDELAYEDEXPANSION
for /l %%C in (1,1,%FILECOUNT%) do (
    echo %%C. !FILE%%C!
    set CHOICEPRMPT=!CHOICEPRMPT!%%C
)
setlocal DISABLEDELAYEDEXPANSION
choice /C %CHOICEPRMPT% /M "Номер файла для действия, 0 для выхода"
set /A CHOICED=%ERRORLEVEL%-1
REM здесь обработка выбора, например
echo Выбрано: %CHOICED%
pause

Всего записей: 2559 | Зарегистр. 12-10-2006 | Отправлено: 11:34 25-08-2024 | Исправлено: BorlandIMHO, 11:55 25-08-2024
virjokk

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

Код:
SetLocal EnableDelayedExpansion
for /f "delims=" %%f in ('findstr /im "some string" *.txt') do (
   set /a n=n+1
   echo !n! %%f
   set "file!n!=%%f"
)
echo.
set /p input=*   Ваш выбор:  
echo !file%input%!
 

Всего записей: 298 | Зарегистр. 19-05-2006 | Отправлено: 11:41 25-08-2024 | Исправлено: virjokk, 11:44 25-08-2024
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BorlandIMHO
С CHOICE выбор будет ограничен 10 файлами, т. к. он принимает единственный символ ввода.
 

Код:
 
set /A FILECOUNT=3
set "FILE1=x:\Any folder\Any File.bin"
set "FILE2=y:\Any other folder\Any File.txt"
set "FILE3=z:\Any folder\Any File.mp4"
setlocal ENABLEDELAYEDEXPANSION
for /l %%C in (1,1,%FILECOUNT%) do echo %%C. !FILE%%C!
:Loop
if defined Prompt set Prompt=
set /p "Prompt=Enter file number (empty to Cancel): "
if defined Prompt (
  if not defined FILE!Prompt! goto Loop
) else (
  echo Cancelled.
  exit /b
)
REM здесь обработка выбора
REM NB: delayed expansion включено.
 


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

Всего записей: 4091 | Зарегистр. 18-04-2005 | Отправлено: 12:29 25-08-2024
BorlandIMHO

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

Цитата:
CHOICE выбор будет ограничен 10 файлами

Знаю. Но, опять же, по условиям задачи "файлов больше одного, чаще всего два, но точно не больше девяти".
Кроме того, choice позволяет использовать не только цифры, так что уже никак не менее 36 возможных вариантов {хотя да, перевод индексов > 9 "в 36-ичную систему счисления" средствами cmd - это отдельный немаленький геморрой}. А для случаев "больше 10 вариантов", если уж так приспичит, можно и "многостраничное меню" изобразить.
Choice {как минимум - в данной задаче} лучше тем, что автоматически контролирует вводимое значение.

Всего записей: 2559 | Зарегистр. 12-10-2006 | Отправлено: 13:50 25-08-2024
shok

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

Код:
@echo off
set /A FILECOUNT=3
set "FILE1=x:\Any folder\Any File.bin"
set "FILE2=y:\Any other folder\Any File.txt"
set "FILE3=z:\Any folder\Any File.mp4"
setlocal ENABLEDELAYEDEXPANSION
 
for /l %%C in (1,1,%FILECOUNT%) do (
    echo %%C. !FILE%%C!
)
 
:Loop
set "Prompt="
set /p "Prompt=Enter file number (empty to Cancel): "
 
if defined Prompt (
    if not defined FILE!Prompt! goto Loop
) else (
    echo Cancelled.
    exit /b
)
 
REM Здесь вы можете добавить код для обработки выбора файла
REM NB: отложенное расширение включено.

 

Код:
@echo off
Отключает отображение команд в окне командной строки, чтобы сделать вывод более чистым и аккуратным.
set /A FILECOUNT=3
Устанавливает переменную FILECOUNT равной 3. Это количество файлов, которые будут обрабатываться.
set “FILE1=x:\Any folder\Any File.bin”
Устанавливает переменную FILE1 на путь к первому файлу.
set “FILE2=y:\Any other folder\Any File.txt”
Устанавливает переменную FILE2 на путь ко второму файлу.
set “FILE3=z:\Any folder\Any File.mp4”
Устанавливает переменную FILE3 на путь к третьему файлу.
setlocal ENABLEDELAYEDEXPANSION
Включает отложенное расширение переменных, что позволяет использовать синтаксис !variable! для доступа к значениям переменных внутри циклов и условных операторов.
for /l %%C in (1,1,%FILECOUNT%) do ( echo %%C. !FILE%%C! )
Цикл for проходит от 1 до значения FILECOUNT (включительно). В каждой итерации выводится номер файла и его путь. Например, для %%C=1 будет выведено 1. x:\Any folder\Any File.bin.
:Loop
Метка, к которой можно вернуться с помощью команды goto. Используется для организации цикла ввода.
set “Prompt=”
Очищает переменную Prompt перед запросом ввода, чтобы избежать использования старого значения.
set /p "Prompt=Enter file number (empty to Cancel): "
Запрашивает у пользователя ввод номера файла. Если пользователь ничего не вводит и просто нажимает Enter, переменная Prompt остается пустой.
if defined Prompt ( if not defined FILE!Prompt! goto Loop )
Проверяет, была ли введена какая-либо строка. Если переменная Prompt определена, проверяется, существует ли переменная FILE с таким номером. Если переменная FILE не определена, скрипт возвращается к метке :Loop и снова запрашивает ввод.
else ( echo Cancelled. exit /b )
Если переменная Prompt не определена (пользователь нажал Enter без ввода), выводится сообщение “Cancelled.” и скрипт завершает работу.
REM Здесь вы можете добавить код для обработки выбора файла
Комментарий, указывающий, где можно добавить код для обработки выбранного файла. Например, можно добавить команды для копирования, перемещения или открытия выбранного файла.
REM NB: отложенное расширение включено.
Напоминание о том, что отложенное расширение переменных включено, что важно учитывать при написании дальнейшего кода.
Этот скрипт позволяет пользователю выбрать один из трех файлов, вводя его номер. Если ввод пустой, скрипт завершает работу. Если введен недопустимый номер, скрипт снова запрашивает ввод.

 
 
 
пример скрипта на PowerShell, который выполняет аналогичную задачу:
 

Код:
# Установка переменных
$fileCount = 3
$files = @(
    "x:\Any folder\Any File.bin",
    "y:\Any other folder\Any File.txt",
    "z:\Any folder\Any File.mp4"
)
 
# Вывод списка файлов
for ($i = 0; $i -lt $fileCount; $i++) {
    Write-Output "$($i + 1). $($files[$i])"
}
 
# Запрос ввода от пользователя
do {
    $prompt = Read-Host "Enter file number (empty to Cancel)"
    if ($prompt -eq "") {
        Write-Output "Cancelled."
        exit
    }
    elseif ($prompt -match '^\d+$' -and [int]$prompt -le $fileCount -and [int]$prompt -gt 0) {
        $selectedFile = $files[$prompt - 1]
        Write-Output "You selected: $selectedFile"
        # Здесь можно добавить код для обработки выбранного файла
        break
    }
    else {
        Write-Output "Invalid input. Please enter a number between 1 and $fileCount."
    }
} while ($true)
 
 
Установка переменных:
$fileCount устанавливается в 3.
$files - массив, содержащий пути к файлам.
Вывод списка файлов:
Цикл for проходит от 0 до fileCount - 1 и выводит номер файла и его путь.
Запрос ввода от пользователя:
Используется Read-Host для запроса ввода номера файла.
Если ввод пустой, выводится сообщение “Cancelled.” и скрипт завершает работу.
Если ввод является числом и находится в пределах от 1 до fileCount, выводится выбранный файл и можно добавить код для его  
обработки.
 
   
Если ввод недопустимый, выводится сообщение об ошибке и запрос повторяется.

Всего записей: 11830 | Зарегистр. 30-04-2006 | Отправлено: 14:57 25-08-2024 | Исправлено: shok, 16:26 25-08-2024
BorlandIMHO

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

Цитата:
так понятно?

"автоматически" українською мовою - автоматично. Так зрозуміло?

Цитата:
на PowerShell

А чё не на C#?..

Всего записей: 2559 | Зарегистр. 12-10-2006 | Отправлено: 19:31 25-08-2024
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13

Компьютерный форум 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