Тяжкое наследие прошлого. проблемы командной строки windows

Внешние команды

  • Exit используется для выхода из консоли DOS или (с опцией /b) только текущего bat-файла или подпрограммы.
  • Ipconfig – это классическая консольная команда, которая выводит информацию о сети. Она включает MAC- и IP-адреса, и маски подсети.
  • Ping пингует IP-адрес, отправляя к нему пакеты данных, чтобы оценить его удаленность и время ожидания (отклика). Также используется для задания паузы. Например, команда ping 127.0.01 –n 6 приостанавливает выполнение кода на 5 с.

Библиотека команд bat-файлов огромна. К счастью, в Сети есть множество страниц, в которых все они перечислены, наряду с переменными пакетного скрипта.

Параметры утилиты XCOPY

xcopy источник ] ] [{/a|/m}] ]] [{/y|/-y}]

источник —
Обязательный параметр. Задает местонахождение и имена файлов для копирования. Параметр должен задавать или диск, или путь.

результат
— Задает место, куда будут скопированы файлы. Параметр может включать имя диска с двоеточием, имя каталога, имя файла или их комбинацию.

/w
— Выводит следующее сообщение с ожиданием подтверждения начала копирования: Нажмите любую клавишу, чтобы начать копирование файлов

/p
— Запрашивает подтверждение при создании каждого файла-результата.

/c
— Игнорирует ошибки.

/v
— Проверяет каждый скопированный файл на соответствие его оригиналу.

/q
— Отменяет вывод на экран сообщений команды xcopy.

/f
— Выводит имена исходных файлов и файлов-результатов в процессе копирования.

/l
— Отображает список копируемых файлов.

/g
— Создает незашифрованные файлы-результаты.

/d
— Копирует только файлы, измененные не ранее заданной даты. Если не включить значение мм-дд-гггг, команда xcopy копирует все файлы-источники, которые новее существующих файлов-результатов. Эта возможность позволяет обновлять только измененные файлы.

/u
— Копирует (обновляет) только те файлы-источники, которые уже существуют в каталоге результата.

/i
— Если источником является каталог или источник содержит подстановочные знаки и результат не существует, команда xcopy считает, что результат — это имя каталога, и создает новый каталог. Затем xcopy копирует все указанные файлы в новый каталог. По умолчанию команда xcopy запрашивает подтверждение, является ли параметр результат каталогом или файлом.

/s
— Копирует каталоги и подкаталоги, если они не пусты. Если параметр /s не задан, команда xcopy будет работать только с одним каталогом.

/e
— Копирует все подкаталоги, включая пустые. Параметр /e используется с параметрами /s и /t.

/t
— Копирует только структуру подкаталога (т. е. дерево), а не файлы. Для копирования пустых каталогов следует задать ключ /e.

/k
— Копирует файлы с атрибутом «только для чтения» с сохранением этого атрибута для скопированных файлов, оригиналы которых имеют этот атрибут. По умолчанию команда xcopy удаляет атрибут «только для чтения».

/r
— Копирует файлы с атрибутом «только для чтения».

/h
— Копирует системные и скрытые файлы. По умолчанию команда xcopy не копирует системные и скрытые файлы.

/n
— Копирует с использованием коротких имен файловой системы NTFS. Параметр /n требуется при копировании из файловой системы NTFS в файловую систему FAT или когда на диске-результате требуется использование соглашения об именах файлов как в файловой системе FAT (8.3). Файлы могут записываться в файловую систему FAT или NTFS.

/o
— Копирует сведения о принадлежности файлов и избирательной таблице управления доступом (DACL).

/x
— Копирует сведения о параметрах аудита файла и системной таблице управления доступом (SACL) (подразумевается наличие /p).

/exclude:файл1]]
— Определяет список файлов, содежащих строки.

/y
— Устраняет выдачу запроса на подтверждение перезаписи существующего конечного файла.

/-y
— Выдает запрос на подтверждение перезаписи существующего конечного файла.

/z
— Копирует по сети в режиме перезапуска.

Примеры команды XCOPY

Чтобы копировать все файлы и подкаталоги (включая пустые подкаталоги) с диска D на диск E, введите.

Утилита XCopy — одно из самых старых и полезных средств перемещения данных. Назначение XCopy состоит в изменении местоположения папок. Проводник во многом заменил эту утилиту, и по возможности мы рекомендуем пользоваться именно им. Тем не менее, существуют несколько важных применений утилиты XCopy:

  • сценарии для манипуляций с файлами;
  • перемещение отдельных файлов в сложной структуре;
  • копирование всех доступных файлов, даже если некоторые файлы не могут быть перемещены;
  • архивирование данных из одной системы на другую;
  • перемещение файлов с конкретными атрибутами.

Многие используют утилиту XCopy в качестве приложения для архивации, поскольку она замечательно справляется с этой задачей. Вы можете легко скопировать файлы данных из папки на архивный носитель, например, другой жесткий диск, дискету, Zip-накопитель или сетевой накопитель. К сожалению, утилита XCopy не поддерживает такой традиционный носитель, как магнитная лента. Кроме того, носитель, на который производится копирование, должен быть размечен, поэтому XCopy не позволяет записывать файлы на компакт диски.

Отобразить результаты в отсортированном порядке

Вы можете использовать переключатель /O, а затем буквенный код для отображения результатов каталога, отсортированных по-разному. Эти буквенные коды включают:

  • D: Сортировка по дате/времени. Сначала появляются старые записи.
  • E: Сортировка по расширению файла в алфавитном порядке.
  • G: Сортировка путем перечисления папок сначала, а затем файлов.
  • N: Сортировка по имени файла/папки в алфавитном порядке.
  • S: Сортировка по размеру файла, от самого маленького до самого большого.

Так, например, Вы можете использовать следующую команду для сортировки результатов по времени и дате, когда сначала появляются более старые записи:

dir /OD

Вы также можете добавить «-» (минус) до любого из указанных выше вариантов, чтобы изменить порядок. Так, например, если Вы хотите сортировать файлы по времени и дате с новыми записями, которые появляются сначала, Вы можете использовать эту команду:

dir /O-D

Заметки

  • Если условие, заданное в команде if, выполняется, будет выполнена команда, следующая за условием. Если условие не выполняется, команда, заданная в операторе if, пропускается, а управление переходит к команде оператора else, если она задана.
  • Когда программа завершается, она возвращает код завершения. С помощью параметра errorlevel коды завершения можно использовать в качестве условий.
  • Использование команды definedпеременная

При использовании команды defined переменная добавляются следующие три переменные: %errorlevel%, %cmdcmdline% и %cmdextversion%.

%errorlevel% замещается строковым представлением текущего значения errorlevel, если только уже не существует переменная среды с именем ERRORLEVEL. В этом случае будет использовано ее значение. В следующем примере показано использование значения errorlevel после выполнения пакетной программы:

goto answer%errorlevel% :answer0 echo Код возврата программы равен 0 :answer1 echo Код возврата программы равен 1 goto end :end echo Готово!

Операторы сравнения оп_сравнения также можно использовать следующим образом:

%cmdcmdline% замещается исходной командной строкой, переданной Cmd.exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем cmdcmdline. В этом случае будет использовано значение cmdcmdline.

%cmdextversion% замещается строковым представлением текущего значения cmdextversion, если только уже не существует переменная среды с именем CMDEXTVERSION. В этом случае будет использовано ее значение.

Использование оператора else

Оператор else должен размещаться в той же строке, что и команда if. Пример:

Приведенный ниже пример не будет работать, поскольку команда del должна заканчиваться новой строкой:

IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. отсутствует

Приведенный ниже пример не будет работать, поскольку команда else должна находиться в той же строке, что и команда if:

Если необходимо разместить всю инструкцию в одной строке, можно использовать следующую правильную форму исходной инструкции:

IF EXIST имя_файла (del имя_файла) ELSE echo имя_файла отсутствует

Использование аргументов командной строки

Теперь, когда вы знаете, как предоставить программе аргументы командной строки, следующим шагом будет доступ к ним из нашей программы на C++. Для этого мы используем другую форму . Эта новая форма принимает два аргумента (по соглашению названные и ) следующим образом:

Иногда вы также можете увидеть и такое:

Несмотря на то, что они обрабатываются одинаково, мы предпочитаем первое представление, потому что его интуитивно легче понять.

– это целочисленный параметр, содержащий счетчик числа аргументов, переданных программе ( = argument count, число аргументов). всегда будет не меньше 1 потому, что первым аргументом всегда является имя самой программы. Каждый аргумент командной строки, предоставляемый пользователем, приведет к увеличению на 1.

– это место, где хранятся фактические значения аргументов ( = argument values, значения аргументов, хотя на самом деле расшифровывается как «argument vectors»). Хотя объявление выглядит устрашающе, на самом деле представляет собой просто массив строк в стиле C. Длина этого массива – .

Давайте напишем короткую программу с именем MyArgs для вывода значений всех параметров командной строки:

Теперь, когда мы вызываем эту программу (MyArgs) с аргументами командной строки «Myfile.txt» и «100«, вывод будет следующим:

Аргумент 0 – это путь и имя текущей запущенной программы. Аргументы 1 и 2 в данном случае – это два параметра командной строки, которые мы передали.

Комментарии

Большое спасибо за статью! Именно то, что мне было нужно.

Офигеть! Полезные советы! Спасибо!

Спасибо большое. Давно искал.

Крутяк, добавлю в закладки.

пфффффффффффф вот это лайфхак епт, я тут тыркаю по 6 команд в гите поштучно, а тут вон оно че Михалыч. спасибо большое!

одна вертикальная черта | используется когда нужно выполнить одновременно несколько команд, не зависимо от результата и завершения предыдущей команды

Одна вертикальная черта | перенаправляет вывод предыдущей команды следующей. Например type «file1.txt» | find ”string1″ ищет в файле строку содержащую «string1» и выводит ее. Этот вывод можно отправить через | на следующую команду. Или, используя пример: (type «file1.txt» | find ”string1″ >nul) && (команды если строка найдена) || (команды если строка не найдена)

При одной вертикальной линии команды выполняются всё равно последовательно.

Bat-файлы Windows являются удобным способом выполнения различных задач на ПК, которым активно пользуются компьютерные умельцы. Они позволяют автоматизировать повседневные задачи, сократить время их выполнения и превратить сложный процесс во что-то посильное рядовому пользователю. В данной статье представлены базовые возможности командных файлов и рекомендации по самостоятельному их написанию.

Анализ аргументов командной строки

Когда вы пишете что-то в командной строке (или запускаете свою программу из среды IDE), то операционная система ответственна за то, чтобы ваш запрос проделал правильный путь. Это связано не только с запуском исполняемого файла, но и с анализом любых аргументов для определения того, как их следует обрабатывать и передавать в программу.

Операционные системы имеют обязательные правила обработки специальных символов (двойные кавычки, бэкслешы и т.д.).

Например:

Результат:

Строки, переданные в двойных кавычках, считаются частью одной и той же строки:

Результат:

Для того, чтобы вывести каждое слово на отдельной строке, используйте бэкслешы:

Результат:

Обработка числовых аргументов

Аргументы командной строки всегда передаются в качестве строк, даже если предоставленное значение является числовым. Чтобы использовать аргумент командной строки в виде числа, вам нужно будет конвертировать его из строки в число. К сожалению, в языке C++ это делается немного сложнее, чем должно быть:

#include <iostream>
#include <string>
#include <sstream> // для std::stringstream
#include <cstdlib> // для exit()

int main(int argc, char *argv[])
{
if (argc <= 1)
{
// В некоторых операционных системах argv может быть просто пустой строкой, без имени программы

// Обрабатываем случай, когда argv может быть пустым или не пустым
if (argv)
std::cout << «Usage: » << argv << » <number>» << ‘\n’;
else
std::cout << «Usage: <program name> <number>» << ‘\n’;

exit(1);
}

std::stringstream convert(argv); // создаем переменную stringstream с именем convert, инициализируя её значением argv

int myint;
if (!(convert >> myint)) // выполняем конвертацию
myint = 0; // если конвертация терпит неудачу, то присваиваем myint значение по умолчанию

std::cout << «Got integer: » << myint << ‘\n’;

return 0;
}

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
29
30

#include <iostream>
#include <string>
#include <sstream> // для std::stringstream
#include <cstdlib> // для exit()

intmain(intargc,char*argv)

{

if(argc<=1)

{

// В некоторых операционных системах argv может быть просто пустой строкой, без имени программы

// Обрабатываем случай, когда argv может быть пустым или не пустым

if(argv)

std::cout<<«Usage: «<<argv<<» <number>»<<‘\n’;

else

std::cout<<«Usage: <program name> <number>»<<‘\n’;

exit(1);

}

std::stringstream convert(argv1);// создаем переменную stringstream с именем convert, инициализируя её значением argv

intmyint;

if(!(convert>>myint))// выполняем конвертацию

myint=;// если конвертация терпит неудачу, то присваиваем myint значение по умолчанию

std::cout<<«Got integer: «<<myint<<‘\n’;

return;

}

Если мы запустим эту программу с аргументом командной строки , то результатом будет:

std::stringstream работает почти так же, как и std::cin. Здесь мы инициализируем переменную std::stringstream значением , так что мы можем использовать оператор для извлечения значения в переменную типа int.

Оператор IF с логическим ИЛИ (OR) в bat файле

С оператором OR так просто не получится, причем есть разные способы.

Способ 1 – через последовательные ИЛИ

Каждое условие записывается в отдельный IF, каждый из которых заносит результат в общую переменную. В итоге, если было выполнено хотя бы одно из условий, в общей переменной будет этот результат.

В примере ниже значение переменной a сравнивается с тремя значениями, и для любого из value1, value2, value3 условие будет выполнено. А если задать a какое-то другое значение, например, set a=value4, то условие выполнено не будет, что нам и нужно:

Способ 2 — через И и НЕ

Этот способ основан на том факте, что логическую операцию ИЛИ можно представить через операции И и НЕ, например, a OR b эквивалентно NOT ( NOT A AND NOT B ). Оператор NOT уже есть в bat файлах, а оператор AND можно представить через последовательные IF, как мы видели выше.

Поэтому тот же результат можно получить по-другому:

Этот способ занимает немного меньше строк, чем предыдущий.

Работа с файлами и папками из командной строки

Бывают ситуации, когда невозможно запустить стандартный файловый менеджер «Проводник Windows». Например, из-за действия вирусов-блокировщиков или при системных сбоях. В любом случае все, что можно сделать при помощи «Проводника», можно сделать и при помощи командной строки. Начнем с самого простого — просмотра содержимого папок.

Просмотр содержимого папки. При запуске командной строки перед мигающим курсором можно увидеть адрес расположения папки учетной записи на жестком диске. В нашем случае — это «C:Usersvzgn»:

Давайте, выведем на экран список все других объектов (файлов и папок), содержащихся в данной папке. Для этого используйте команду dir:

Объекты, напротив которых написано — это папки, все остальное — файлы (напротив них указан размер в байтах).

Команду dir можно применять вообще папкам, расположенным в вообще любом месте на жестком диске. Для этого после команды следует указать путь до каталога. К примеру, для просмотра содержимого папки «Windows» на диске «C:» следует ввести команду:

dir c:windows

Запомните одно простое правило. Если в именах папок/файлов присутствуют пробелы, их следует писать в двойных («имя папки или файла») кавычках.

Открытие файла из командной строки. Для открытия файла достаточно вписать его полное название вместе с расширением в командную строку. Что не вводить имя файла целиком, используйте клавишу «Tab» (с ее помощью можно поочередно перебирать имена всех объектов в текущей папке).

В нашем случае был открыт файл .pgAdmin4.startup.log при помощи «Блокнота». Если бы это был музыкальный файл, запустился бы аудиопроигрыватель, если DOC/DOCX-файл — редактор «MS Word» и т.д. Таким образом, открытие файла в командной строке равнозначно двойному клику по файлу в «Проводнике Windows».

Переход в другую папку. Для перехода в папку используется команда cd, после которой следует прописать путь к открываемой папке либо просто ее имя (если она расположена в нашем текущем местоположении на жестком диске).

Перейдем в папку «Music». Т.к. она находится в текущем каталоге, достаточно ввести в консоль:

cd music

Теперь наше местоположение изменилось на «C:UsersvzgnMusic».

Давайте, перейдем в какую-нибудь папку, расположенную на другом локальном диске. Это можно сделать несколькими способами, но воспользуемся самым легким для запоминания.

Для начала перейдем в сам локальный диск (изменим наше местоположение). Для этого достаточно использовать (независимо от текущего местоположения) команду e:. Вместо e можно использовать любую другую букву локального диска (или даже флешки, например):

Допустим, нам известно, что на диске «E» существует папка «Install», а в ней — пака «Web». Перейти в нее можно одной командой:

cd e:installweb

Запуск/открытие программы/файлы в другой папке или на другом диске. Запустим программу, расположенную где-нибудь глубоко на диске. Для запуска файла или программы можно просто указать полный путь до него. Текущее местоположение в этом случае не имеет значения. Запустим, например, текстовый редактор «Notepad++» одной командой:

C:»Program Files»Notepad++
otepad++.exe

Обратите внимание, что имя папки «Program Files» взято в кавычки, т.к. в нем присутствует пробел

Создание, удаление и переименование файлов и папок. Из командной строки можно выполнить все эти операции над файлами и папками.

Создание простого текстового файла — copy nul простой_текстовый_файл.txt. Перед названием файла можно указать путь до конечной папки, в которой тот будет создан (если не указать, файл создастся в текущей папке).

Создание папки — mkdir папка. Папка также создается в текущем местоположении.

  • Удаление файла (или нескольких) — del простой_текстовый_файл.txt (если требуется удалить несколько файлов, просто вписываем их имена друг за другом через пробел). Удаляем созданный ранее файл.
  • Удаление папки — rmdir папка. Удаляем созданную ранее папку.

Переименование папки/файла — ren простой_текстовый_файл.txt новое_имя_файла.txt или ren папка новое_имя_папки. Переименуем созданный файл и папку.

Через командную строку можно выполнить и ряд других операций над файлами и папками, включая копирование, перемещение, применение/изменение атрибутов (скрытый, системный, только для чтения и т.д.), слияние и т.д.

4 ответа

Лучший ответ

Вы пытаетесь использовать синтаксис расширения параметра для переменной среды — это не сработает. Но делать то, что хочешь, относительно легко.

Использование ВЫЗОВА (относительно медленно):

Использование FOR, при условии, что переменная не содержит подстановочных знаков (быстро)

Использование FOR, если переменная может содержать подстановочные знаки (также быстро)

Примечание 1. Если переменная не содержит полного пути, тогда все решения будут пытаться преобразовать имя в абсолютный путь и вернут полный абсолютный путь. Например, если var содержит , тогда решения будут включать полный путь к текущему каталогу, даже если файл не найден. Что-то вроде .

Примечание 2: все приведенные выше решения удаляют все кавычки из пути.

Примечание 3: путь может включать символ , что вызовет проблемы при раскрытии или , поскольку вы включили отложенное раскрытие. Отложенное расширение повредит как , так и , если значение содержит . Есть решение, которое включает защиту как , так и . Вот демонстрация, примененная к последнему решению выше. Защита требует нормального расширения, и, поскольку вы находитесь в блоке кода, требуется как минимум один ВЫЗОВ. Это можно было бы сделать без подпрограммы, но это проще с подпрограммой. Подпрограмма предполагает, что переменная называется .

8

dbenham
13 Фев 2013 в 21:03

Будет ли это работать:

Где Echo — это имя вашего exe.

% CD% также может работать: Echo% CD%

-2

rheitzman
18 Апр 2015 в 00:24

Полный пример извлечения путей из переменной:

MrCalvin
19 Июл 2020 в 06:59

Я верю (еще раз), что многие вопросы относятся к одной и той же теме (строковые ограничения или разделение строк).

Вместо того, чтобы давать вам весь код, я дам вам шаблон и объясню, почему не работает.

Во-первых, почему не сработал .

Прежде чем я перейду к модификаторам, давайте обсудим параметры. Возможно, вы знаете, что командные файлы могут анализировать параметры друг друга. Эти параметры можно вызывать, используя один знак процента (%) перед числами 0–9. Насколько мне известно (кто-то, возможно, нашел способ разобрать больше), можно проанализировать только 9 параметров. Вы можете подумать, что это неправильно (правильно есть 10 параметров?). Параметры 1–9 анализируются в пакетном файле (или функции в одном),% 0 — это путь к пакетному файлу (или имя функции). Если вы посмотрите, имеет некоторое (не совсем) сходство с% 0. Об этом будет сказано ниже.

Во-вторых, термин имеет в себе модификаторы. Модификаторы — это вещи, которые изменяют переменные (только в случае параметров и тех, которые объявлены в циклах , вы знаете те, которые имеют двойные знаки процента, такие как %% i) и параметры. Модификатор расширяет параметр только до буквы диска, в то время как расширяет параметр только до пути. Вы можете подумать, что они будут противоречить друг другу, но параметры можно комбинировать, чтобы создать чрезвычайно странные форматы.

Итак, как вы можете видеть, вы попытались заменить 0 своим именем переменной не удалось, потому что он не указан для подобных вещей.

Теперь перейдем к шаблону.

Вы можете ограничить переменные (и поместить их в другие переменные) следующим образом:

Не волнуйтесь, если это вас сбивает с толку, я сейчас объясню компоненты.

Во-первых, обратите внимание на отсутствие переключателя. Это потому, что это не математическая функция (не знаю, зачем я это добавил)

Итак, прежде чем я объясню это, вот пример того, что он будет делать с именем переменной , имеющим значение .

Используя эту строку кода, теперь будет равно . Это потому, что он воссоздает переменную с уменьшенной версией исходного значения (ну, это трудно объяснить). Как видите, в приведенном выше шаблоне есть , где был . Это потому, что он пропускает первые 5 символов и устанавливает переменную в качестве следующего символа или (я очень надеюсь, что вы это понимаете).

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

Я действительно надеюсь, что это поможет, потому что я, вероятно, не пойму ни слова из этого.

Может ли кто-нибудь перенаправить этого бедняги на ссылку, объясняющую это лучше (я пробовал, хорошо!)?

1

BDM
13 Фев 2013 в 08:32

Модификаторы командной строки

С пакетными параметрами можно также использовать модификаторы. Модификаторы используют информацию о текущем диске и каталоге как часть или полное имя файла или каталога. Для использования модификатора напечатайте символ (%), затем символ тильды (~), а затем соответствующий модификатор (т.е., %~модификатор).

В следующей таблице описаны модификторы, используемые для расширения.

Модификатор Описание
%~1 расширение %1 и удаление любых кавычек («»)
%~f1 замена %1 полным путем
%~d1 замена %1 именем диска
%~p1 замена %1 путем
%~n1 замена %1 именем файла
%~x1 замена %1 расширением имени файла
%~s1 замена путем, содержащим только короткие имена
%~a1 Замена %1 атрибутами файла
%~t1 замена %1 датой и временем модификации файла
%~z1 замена %1 размером файла
%~$PATH:1 поиск в каталогах, перечисленных в переменной среды PATH, замена %1 полным именем первого найденного файла. Если переменная среды не определена или поиск не обнаружил файлов, модификатор выдает пустую строку.

В следующей таблице даны возможные комбинации модификаторов и квалификаторов для получения более сложных результатов.

Модификатор Описание
%~dp1 замена %1 именем диска и путем
%~nx1 замена %1 именем файла и расширением
%~dp$PATH:1 поиск в каталогах, перечисленных в переменной среды PATH, и замена %1 именем диска и путем к первому найденному файлу.
%~ftza1 замена %1 строкой, аналогичной результату работы программы dir

Примечания

  • %1 и PATH в показанных выше примерах можно заменить на другие значения пакетных параметров.
  • Модификатор %* является уникальным, так как он представляет все аргументы, переданные пакетному файлу. Этот модификатор не используется в комбинации с модификатором %~. Конструкция %~ должна завершаться допустимым номером аргумента.
  • Нельзя манипулировать пакетными параметрами подобно переменным среды. Нельзя искать и заменять значения или контролировать подстроки. Но переменной среды можно назначить параметр, а потом уже ей манипулировать.
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: