Аргументы командной строки windows

  • SS64
  • CMD
  • How-to

How-to: Pass Command Line arguments (Parameters) to a Windows batch file.

A command line argument (or parameter) is any value passed into a batch script on the command line:

C: data-lazy-src=

Arguments can also be passed to a subroutine with CALL:

CALL :my_sub 2468

You can get the value of any argument using a % followed by its numerical position on the command line. The first item passed is always %1 the second item is always %2 and so on.

%0 in a batch script will contain the batch file name/command.

%* in a batch script refers to all the arguments (e.g. %1 %2 %3 %4 %5 …%255)
only the arguments %0 up to %9 can be referenced by number.

If the argument being passed contains any spaces, then surround it with double quotes.
If there is any chance that an argument may be NULL or a zero length string, then surround it with double quotes. This will keep the parameter numbers (%1 %2 etc) consistent.

Parameter Extensions

When an argument is used to supply a filename then the following extended syntax can be applied:
We are using the variable %1 (but this works for any argument, including FOR parameters).

%~f1  Expand %1 to a Fully qualified path name — C:\utils\MyFile.txt

%~d1
  Expand %1 to a Drive letter only — C:

%~p1  Expand %1 to a Path only e.g. \utils\ this includes a trailing \ which will be interpreted as an escape character by some commands.

%~n1  Expand %1 to a file Name without file extension or path — MyFile
or if only a path is present, with no trailing backslash, the last folder
in that path.

%~x1  Expand %1 to a file eXtension only — .txt

%~s1  Change the meaning of f, n, s and x to reference the Short 8.3 name (if it exists.)

%~1   Expand %1 removing any surrounding quotes («)

%~a1  Display the file attributes of %1

%~t1  Display the date/time of %1

%~z1  Display the file size of %1

%~$PATH:1  Search the PATH environment variable and expand %1 to the fully qualified name of the first match found.

The modifiers above can be combined:

%~dp1 Expand %1 to a drive letter and path only.

%~sp1 Expand %1 to a path shortened to 8.3 characters.

%~nx2 Expand %2 to a file name and extension only.

These parameter/ argument variables are always denoted with a single leading %
This is unlike regular variables which have both leading and trailing %’s such as %variable%, or FOR command variables which use a single leading % on the command line or a double leading %% when used in a batch file.

When used as part of a FOR command in a batch file, two %’s are required:

Set _file=C:\Program Files\SS64\Demo.exe
For %%G in («%_file%») DO echo Drive=%%~dG Path=%%~pG Name=%%~nG Ext=%%~xG

Parameter expansion does not generally check that the file or folder exists. If the parameter is a wildcard that matches one or more filenames, then the first file found will be used in parameter expansion. Otherwise parameter expansion will process the value as a text string. In other words: obtaining a filename from a parameter with or without any expansion is not a guarantee that the file actually exists. If you need to be sure, use IF EXISTS…

Parameter expansion will treat a Full Stop within a directory name as a file extension, so for a name like «Sample 2.6.4» the output of %~n1 will be truncated to «Sample 2.6» to return the whole directory name use %1 or %~nx1

If the output of DIR, or a filename with no drive letter/path is expanded to display a Full pathname %~f1 the command shell will assume; often incorrectly; that the file resides in the current directory.

When writing batch scripts it’s a good idea to store the values in a more descriptive variable:
SET _LogFile=%~dp1

The rest of the script can then refer to the new variable name %_LogFile%
This will also make life easier if you later need to change around the order of the parameters.

Tokenization

Tokenization of the command line arguments is not always done by the cmd.exe shell. Most often the tokenization is done by the newly formed processes’ runtime, at the OS level, Windows passes a command line untokenized as a single string to the new process. You can read more about the low-level details of the batch language/cmd escaping from the excellent answers by jeb and dbenham on this StackOverflow question.

Passing by Reference

In addition to passing numeric or string values on the command line, it is also possible to pass a variable name and then use the variable to transfer data between scripts or subroutines. Passing by reference is a slightly more advanced technique but can be essential if the string contains characters that are CMD delimiters or quotes, otherwise passing a string like Start & middle:»and & End is likely to break something.

Drag and Drop

If you drag and drop one or more files or folders onto a batch file, the batch will be executed and the filenames (or folder names) will be passed to the batch file as arguments:
%1 = «first file», %2 = «second file» etc
Quotes are automatically added to long file names. This also happens if you drag a file into a CMD window, the full quoted filename will appear at the prompt.
If you need to drag and drop more than 9 files, use the SHIFT command inside the script.

Links relative to the Batch Script

You can get the pathname of the batch script itself with %0, parameter extensions can be applied to this so %~dp0 will return the Drive and Path to the batch script e.g. W:\scripts\ and %~f0 will return the full pathname W:\scripts\mybatch.cmd

You can refer to other files in the same folder as the batch script by using this syntax:

  CALL %0\..\SecondBatch.cmd

This can even be used in a subroutine, Echo %0 will give the call label but, echo «%~nx0» will give you the filename of the batch script.

When the %0 variable is expanded, the result is enclosed in quotation marks.

Use %~a1 to display the Extended Attributes of a file.

FOR’s %%~aI recognizes 9 NTFS file attributes. The expansion of a file attribute produces a series of 9 dashes, with each recognized attribute replacing a dash with a letter. A file with no recognized attributes or with none set will expand to 9 dashes like this: ———

 Attribute                    Expansion 
 FILE_ATTRIBUTE_DIRECTORY     d-------- 
 FILE_ATTRIBUTE_READONLY      -r------- 
 FILE_ATTRIBUTE_ARCHIVE       --a------ 
 FILE_ATTRIBUTE_HIDDEN        ---h----- 
 FILE_ATTRIBUTE_SYSTEM        ----s---- 
 FILE_ATTRIBUTE_COMPRESSED    -----c--- 
 FILE_ATTRIBUTE_OFFLINE       ------o-- 
 FILE_ATTRIBUTE_TEMPORARY     -------t- 
 FILE_ATTRIBUTE_REPARSE_POINT --------l
 FILE_ATTRIBUTE_NORMAL        --------- 

Other NTFS attributes not recognised by %%~aI can be read using FSUTIL usn command:
FILE_ATTRIBUTE_ENCRYPTED
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
FILE_ATTRIBUTE_SPARSE_FILE

Example: Expansion of a file with the Hidden and System attributes:
—hs—-

Maximum line length

The maximum length of any command line (or variable) within CMD is 8191 characters.

Terminology: Command-line Argument or Parameter?

In mathematical terms a parameter is «a numerical or other measurable factor» so typically a number.

In programming terminology:
A parameter represents a value that the procedure expects you to pass when you call it.
An argument represents the actual value that you pass to a procedure.

In practice the phrases argument and parameter tend to be used interchangeably, CMD batch files do not perform any type checking.

The FOR command creates parameter variables which are identified with a letter rather than a number (e.g. %%G).
The Parameter Expansions described above can also be applied to these.
To avoid confusion between the two sets of letters, avoid using the letters (a, d, f, n, p, s, t, x, z) as FOR parameters or just choose a FOR parameter letter that is UPPER case.
So for example in a reference like %%~fG the %%G is the FOR parameter, and the ~f is the Parameter Expansion.

Examples

Pass parameters from one batch to another:

   MyBatch.cmd SMITH 100

Or as part of a CALL :

   CALL MyBatch.cmd SMITH 100

Get the file size of C:\demo\sample.xlsx using the %~z parameter extension:

   @Echo off
   For %%G in ("C:\demo\sample.xlsx") do set _var=%%~zG
   Echo File size is %_var%

Extract the parameters passed to a batch file, using a For /F loop:

   [test-args.cmd]
   For /F "tokens=1-3*" %%A in ("%*") DO (
   SET _Arg1=%%A
   SET _Arg2=%%B
   SET _Arg3=%%C
   SET _ArgRest=%%D
 )
 Echo [%_Arg1%][%_Arg2%][%_Arg3%][%_ArgRest%]

Passing values from one part of a script to another:

   :: Using CALL to jump to a subroutine
   CALL :s_staff SMITH 100

   :: Calling a subroutine from a FOR command
   FOR /F %%G IN ('DIR /b *.*') DO call :s_subroutine %%G

“I came here for a good argument, No you didn’t, you came here for an argument” ~ Monty Python

Related commands

CALL — Call one batch program from another.
CMD — Start a new DOS shell (cmd.exe).
IF — Test that required inputs are in place (not NULL).
FOR — Conditionally perform a command several times.
SETLOCAL — Control the visibility of environment variables.
SHIFT — Shift the position of replaceable parameters in a batch file.
How-to: Escape chars, delimiters and quotes.
PowerShell equivalent: Cast a pathname string to [System.IO.FileInfo]
StackOverflow — Script to parse optional arguments by Dave Benham.
How Command Line Parameters are Parsed by David Deley.
StackOverflow — How does the Windows Command Interpreter (CMD.EXE) parse scripts?
Equivalent bash command (Linux): dirname — Convert a full pathname to just a path.


Copyright © 1999-2025 SS64.com
Some rights reserved

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

После того как администратор создал и успешно запустил свой первый простой сценарий командной строки (скажем, для диагностики сервера с помощью утилиты ping), он задумывается о том, как сделать так, чтобы было удобно повторно использовать данный сценарий при тестировании другого сервера или группы серверов. В результате он может прийти к выводу, что наилучшим решением было бы предусмотреть возможность ввода в сценарий некоторых входных данных, которые можно изменять. Если жестко запрограммировать эти входные данные, то при каждом их изменении придется соответствующим образом редактировать код сценария. Например, если явно задать имя компьютера, на котором требуется выполнить те или иные операции, то перед каждым запуском сценария на другом компьютере придется редактировать код. Данный подход не просто неудобен, он может послужить причиной непреднамеренного изменения кода сценария и, соответственно, привести к его некорректной работе. Предпочтительнее сохранить код сценария «в неприкосновенности» после его отладки, что обеспечит его нормальную работу в дальнейшем.

Если входные данные, которые предполагается передавать сценарию, имеют незначительный объем, тогда весьма эффективным решением для организации их ввода будет использование аргументов командной строки. Создав сценарий, управляемый аргументами, впоследствии можно легко преобразовать его для использования других технологий ввода данных в соответствии с новыми требованиями. Альтернативные технологии ввода данных рассматриваются во врезке «Возможные способы ввода данных». Чтобы помочь читателям разобраться в том, как работать с аргументами командной строки и избегать типичных ошибок, я собрал в данной статье несколько наиболее часто задаваемых вопросов

В. Одна из часто используемых мною утилит требует указания около 10 различных ключей и параметров. Поэтому перед каждым ее запуском мне приходится просматривать справочную систему и вспоминать, какой именно синтаксис вызова я использовал в последний раз. Я написал специальный сценарий, который мне приходится каждый раз редактировать. При этом я обнаружил, что фактически требуется изменять только три параметра. Могу ли я использовать аргументы командной строки для передачи этих параметров сценарию, когда мне нужно в очередной раз запустить данную утилиту?

О. Создание сценариев для запуска из них утилит пакета Resource Kit или программ независимых разработчиков — прекрасная возможность для применения аргументов командной строки, особенно в тех случаях, когда запускаемая программа имеет строку вызова, содержащую несколько сложных ключей. Причем в большинстве случаев утилита, скорее всего, запускается с одним и тем же набором ключей. Я, например, для переноса больших объемов данных часто пользуюсь утилитой Robocopy (из набора Microsoft Windows Resource Kit) — программой, имеющей множество различных ключей запуска. Если создать сценарий, который будет выполнять большую часть операций, реализуемых программой, можно, во-первых, сэкономить время, а во-вторых, гарантировать точность результатов работы данной утилиты. Для этого нужно просто прописать в сценарии те ключи, которые вы обычно не изменяете, и передавать ему в виде аргументов значения тех ключей, которые приходится изменять часто. Однако при этом следует понимать, что случайное добавление и удаление каких-либо ключей при работе с Robocopy может привести к неприятным последствиям — например, могут быть перемещены какие-то важные файлы, которые предполагалось только скопировать, либо пунктом назначения для файлов оказался NTFS-ресурс, к которому отсутствуют необходимые разрешения доступа.

В листинге 1 показан сценарий RoboArg.bat, который представляет собой пример запуска утилиты Robocopy. При запуске сценария из командной строки ему должны быть переданы два аргумента. Ниже приведена строка запуска этого сценария:

RoboArg.bat "C:sourcefiles" 
"D:destinationfiles"

где C:sourcefiles — путь к файлам, которые требуется скопировать, а D:destinationfiles указывает местоположение каталога, в который нужно скопировать данные файлы.

В среде Windows существует специальная группа переменных окружения для поддержки работы с аргументами сценариев командной строки: они имеют обозначения от %0 до %9. Эти переменные могут использоваться для передачи входной информации сценарию при его выполнении. При этом переменная %1 определяет первый аргумент, вводимый в командной строке, переменная %2 — второй и т. д. Таким образом, в сценарии RoboArg.bat переменными %1 и %2 определяются соответственно исходный и конечный файлы.

В начале сценария RoboArg.bat выполняют две процедуры проверки, чтобы удостовериться в том, что было введено правильное количество аргументов. В первой из них используется команда IF, с помощью которой значение аргумента %2 сравнивается с пустой строкой. При выявлении совпадения выводится предупреждение о том, что введено недостаточное количество аргументов, после чего сценарий завершает работу. Вторая проверка заключается в том, что с помощью оператора GTR (что означает «больше, чем», т. е. это эквивалентно символу «>») определяется, содержит ли переменная %3 какое-либо значение. Оператор GTR служит для сравнения двух величин. Если первая величина больше, чем вторая, то результатом сравнения будет TRUE и будут выполняться те команды, которые следуют в данной строке за оператором сравнения. Если же первая величина не больше второй, то результатом сравнения будет FALSE, поэтому исполнительный механизм обработки сценария не будет выполнять остальные команды, имеющиеся в этой строке, а перейдет к обработке следующей строки сценария. Хотя оператор GTR обычно используется как математический, здесь я применил его для проверки существования значений. При создании сценариев командной строки проверка того, содержит ли некоторая переменная какое-либо значение, всегда является более надежной, чем попытка убедиться, что эта переменная не содержит ничего. Если переменная %3 является пустой, то ее содержимое не может быть больше 1, тогда сценарий игнорирует оставшиеся в этой строке команды и переходит к следующей строке, в которой производится запуск утилиты Robocopy. Если же переменная %3 имеет не пустое значение, то эта величина будет больше 1, поэтому данная строка будет обработана полностью, в результате чего будет выведено сообщение Too many arguments («Слишком много аргументов»), а затем сценарий завершит работу. Несколько других подходов к обработке аргументов кратко рассматриваются во врезке «Методы работы с аргументами».

В. Я понимаю, что переменные %1 и %2 соответствуют первому и второму аргументу. А имеет ли какое-либо назначение переменная %0?

О. Да, переменная %0 определяет путь к сценарию. Чтобы увидеть использование переменной %0 в действии, следует запустить сценарий TestVar.bat, показанный в листинге 2.

Возможность получения данных о каталоге размещения сценария является весьма полезной. Допустим, требуется, чтобы сценарий сам определял местонахождение других используемых файлов (таких, как утилиты, входные и выходные файлы). В этом случае для получения информации о размещении можно задействовать переменную %0 в сочетании с командой CALL. После этого сценарий можно разместить на любом сервере и в любом каталоге, и он будет корректно работать, причем изменения в него вносить не придется. В листинге 3 показан пример сценария Test0Var.bat, в котором имеется процедура CALL, которую можно применить для реализации подобной функции автопоиска.

В данном примере использование параметра командного файла %∼dp1 демонстрирует возможность подстановки параметров, которая весьма полезна во многих операциях, выполняемых в сценариях. В табл. 1 перечислено несколько вариантов использования параметров командного файла. Обратите внимание, что %∼dp1 представляет собой комбинацию параметров %∼d1 и %∼p1, каждый из которых определяет соответственно букву, обозначающую диск, и путь. Полный перечень вариантов использования этих параметров можно увидеть, запустив команду CALL с ключом /?.

В. Если использовать для определения местонахождения .bat-файла не сочетание параметров командного файла %∼dp1, а переменную окружения %CD%, то не будет ли это более простым решением?

О. С помощью переменной %CD% можно определить место, из которого запускается сценарий. Но это место не обязательно должно соответствовать тому каталогу, в котором он размещается.

В. Я знаю, что аргументам сценария могут соответствовать только девять переменных (от %1 до %9). Каково максимальное количество символов и аргументов, которое я могу ввести в командной строке?

О. Максимальное количество вводимых символов будет зависеть от типа используемой операционной системы и от пути к сценарию, длина которого тоже будет иметь значение для максимального количества символов, которые могут быть введены в командной строке. В Windows 2000 это значение соответствует примерно 2045 символам и пробелам. Однако, если вы собираетесь вводить столь значительное число символов в командной строке, будьте готовы к тому, что придется выполнять проверку корректности введенной информации. Также следует иметь в виду, что оболочка командной строки не всегда выводит сообщение об ошибке при превышении максимального количества символов. Если вам все же необходимо использовать очень длинные строки ввода или большое количество этих строк, советую размещать их во входном файле, который затем обрабатывать сценарием.

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

В листинге 4 показан сценарий TestLotsOfArgs.bat script, в котором приводится пример обработки неограниченного количества аргументов. Данный код также демонстрирует, как можно обнаруживать, что никаких аргументов вводить не требуется. В данном примере выполняется запуск утилиты ping для каждого аргумента server-name.

В. При запуске утилиты DSQuery я попытался указать в качестве аргумента строку ADsPath, однако в таком виде она не работает. Синтаксис запуска сценария выглядел следующим образом:

MyScript.bat ou=server,dc=sales,dc=mycompany, dc=com

Что я сделал неправильно?

О. Типичным символом разделителя аргументов является пробел, однако допускается также использование других символов для разделения аргументов (таких, как запятая или точка с запятой). Поэтому для того, чтобы использовать в качестве аргумента строку ADsPath, нужно заключать ее в двойные кавычки, тогда сценарий не будет интерпретировать запятые как разделители. В некоторых случаях после того, как аргумент передан внутрь сценария, может потребоваться удалить символы двойных кавычек. Для этого можно использовать подстановку, что показано в примере листинга 5. Данный код представляет собой весьма удобный способ удаления или замены символов и может использоваться для организации фильтрации двойных кавычек. Базовый синтаксис выглядит следующим образом: %PATH:str1=str2%. Более подробные сведения о подстановках переменных можно получить, набрав в командной строке команду SET /?.

Если вы запустили команду CALL /?, как описывалось выше, то наверняка обнаружили еще один метод удаления двойных кавычек. В листинге 6 показан пример использования команды CALL для фильтрации двойных кавычек.

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

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

О. Да, можно создать такой сценарий, у которого есть три аргумента, для которых используются метки. В качестве примера я разработал второй вариант сценария для запуска Robocopy, который называется AdvancedArguments ForRobo.bat, приведенный в листинге 7. Здесь используется набор из трех стандартных аргументов, которым далее присваиваются метки. В результате параметры размещения исходного, целевого файла, а также файла журнала могут указываться в произвольном порядке. Синтаксис запуска сценария выглядит следующим образом:

AdvancedArgumentsForRobo.bat 
/S:"D:sourcelocation"
/D:"serverdestinationlocation"
/L:"D:logfileslog.txt".

Здесь /S определяет местонахождение исходного файла (source), /D задает местонахождение целевого (destination) файла, а /L соответствует месту размещения файла журнала (log) работы программы Robocopy. Обратите внимание, что можно задавать как локальные, так и доступные сетевые каталоги.

При работе с аргументами я рекомендую руководствоваться приведенными ниже основными принципами, которым я следовал при создании сценария AdvancedArgumentsForRobo.bat.

  • Если пользователь попытается запустить сценарий без аргументов, необходимо вывести экран справки, содержащий подсказки для корректного ввода аргументов.
  • По возможности выполняйте проверку правильности ввода аргументов. Например, в сценарии, показанном в листинге 7, для проверки существования каталогов источника и пункта назначения используется оператор IF EXIST. Кроме того, если вы работаете с аргументами, имеющими метки, желательно проверять, не задан ли какой-либо из них дважды и не пропущен ли какой-либо из аргументов. Как реализовать подобную проверку, показано во фрагменте кода с меткой A в листинге 7.
  • Предоставьте пользователю возможность принять окончательное решение перед запуском процедур. Эта возможность особенно важна в тех случаях, когда в сценарии выполняются операции, связанные с изменением, копированием или удалением файлов, учетных записей пользователей, членов групп и т. д. Если сценарий задействует только функции чтения или выполняет те или иные запросы, то наличие данной возможности не столь принципиально, однако я все равно советую реализовывать ее. В тех случаях когда предполагается использовать сценарий для запуска тех или иных операций по расписанию, будет целесообразно игнорировать или исключить из него код, требующий ввода данных пользователем.

В. Можно ли использовать аргументы при работе с ярлыками и в планировщике заданий?

О. Аргументы можно задавать в ярлыках и указателях планировщика заданий, однако я рекомендую добавлять аргументы по завершении процесса создания ярлыка или работы мастера создания задачи Task Setup Wizard. В ходе работы мастера создайте указатель на .bat файл, а затем добавьте аргументы вручную. Если описание пути к сценарию содержит пробелы, не забудьте заключить его — но не аргументы сценария! — в двойные кавычки. Если при создании ярлыков используется утилита shortcut.exe (средство для создания ярлыков Microsoft), то в этом случае для задания аргументов можно использовать ключ -a данной утилиты.

В. Можете ли Вы порекомендовать какой-либо быстрый способ использования аргументов командной строки без необходимости ввода аргументов с клавиатуры для исключения возможных ошибок ввода?

О. Для того чтобы сделать ввод команд более точным, я пользуюсь несколькими приемами. Прежде всего, в диалоговом окне свойств Properties командной строки нужно выбрать режимы быстрого редактирования QuickEdit Mode и вставки Insert Mode. Это позволит копировать текст из окна командной строки, а также вставлять его туда. Первое, что вводится в командной строке, — это путь к сценарию. Следует понимать, что длинный путь к сценарию создаст массу дополнительных хлопот. Одна маленькая опечатка может привести к появлению ошибок.

На мой взгляд, самым простым способом быстрого поиска пути к сценарию является использование свободно распространяемой утилиты SAMenu от Smaller Animals Software. Это небольшое расширение проводника Windows дает возможность копировать путь к файлу в буфер обмена путем выбора соответствующего пункта из контекстного меню, вызываемого правой кнопкой мыши. Для этого нужно просто щелкнуть правой кнопкой на файле сценария и выбрать пункт Copy Path to Clipboard. Далее щелчком правой кнопкой мыши в окне командной строки можно перенести скопированное значение пути к сценарию в командную строку. Аналогичным образом можно вводить в командную строку пути к другим файлам и каталогам. Также можно использовать перетаскивание необходимых файлов в окно командной строки: следует просто выбрать свой сценарий и перетащить его мышью в окно командной строки, нажав на левую или правую кнопку.

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

Используйте аргументы

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

Дик Льюис (dlewis@winnetmag.com) — Старший системный инженер компании CKT Consulting в Калифорнии. Имеет сертификаты MCSE и MCT, специализируется на системах управления масштаба предприятия.


Возможные способы ввода данных

Использование аргументов в командной строке традиционно считается оптимальным вариантом для реализации ввода внешних данных в сценарии. Но существуют и альтернативные способы.

Например, в Windows NT и последующих версиях с помощью команды For /F можно выполнять построчное считывание данных из входного файла. В тех случаях когда вводимые внешние данные имеют большой объем — скажем, список из 200 компьютеров или 500 пользователей, — обработка входного файла может оказаться предпочтительным решением. При этом можно разработать сценарий, в котором аргументы будут использоваться для передачи информации о размещении входного и выходного файлов; таким образом, применение технологии обработки файлов не исключает возможности использования аргументов.

Еще один вариант ввода данных — с помощью меню. Если потенциальные пользователи сценария не имеют опыта работы с этим инструментом, можно предложить им статическое меню с приглашением для ввода текста. Наилучшими альтернативами в этом случае являются команда Choice из пакета Microsoft Windows Resource Kit, а также команда Set /P из операционной системы Windows.


Методы работы с аргументами

Для работы с аргументами можно выбрать один из нескольких подходов. В идеале хочется сделать так, чтобы процедура ввода аргументов была максимально простой и интуитивно понятной для пользователя, при этом гарантировалась бы высокая точность ввода данных. В зависимости от данных, которые требуется передать сценарию в качестве аргументов, определяется оптимальный способ работы с ними. Если вы не уверены, что выбранный способ работы с аргументами оправдан и интуитивно понятен, передайте сценарий на некоторое время в тестовую эксплуатацию нескольким пользователям, а потом попросите их высказать свое мнение по результатам тестирования. Ниже приводится три основных подхода к работе с аргументами.

  • Располагайте аргументы по порядку. Порядок следования аргументов указывает на то, что представляет собой каждый из них. Многие утилиты из пакетов Resource Kit, а также программы от независимых производителей принимают входные данные через аргументы, упорядоченные определенным образом. Примером данного подхода может служить сценарий копирования файлов из одного места в другое, использующий утилиту Robocopy. Здесь логический порядок следования аргументов будет таким: размещение исходного файла, размещение целевого файла, размещение файла журнала. Если в данном случае поменять местами источник и пункт назначения, то файлы из пункта назначения будут переписаны поверх исходных файлов.
  • При работе с аргументами используйте метки. Например, можно задать метки таким образом, чтобы сценарий понимал, что аргументу, перед которым стоит метка /S, соответствует файл-источник, а аргумент, указанный после метки /D, — это пункт назначения. Использование маркированных аргументов исключит возможность появления последовательных ошибок в упомянутом выше примере с запуском утилиты Robocopy. Но если вы решили использовать этот подход, то в вашем сценарии должна быть предусмотрена процедура предварительного перехвата аргументов и удаления из них информации о метках. Пример его реализации показан в листинге 7.
  • В некоторых сценариях все аргументы могут быть просто элементами списка однотипных объектов, передаваемых сценарию. Примером может служить сценарий Ping, который запускает утилиту ping для каждого из серверов, чьи имена были переданы ему в качестве аргументов. Если вы собираетесь использовать данный подход, то необходимо организовать внутри сценария некоторый цикл, который бы последовательно брал каждый из имеющихся аргументов и запускал для него соответствующую процедуру. Пример реализации такой процедуры в сценарии был показан в листинге 4, где с помощью утилиты ping опрашивался список серверов, имена которых были переданы сценарию в виде аргументов.

Листинг 1. RoboArg.bat

If “%2”==”” Echo Недостаточное количество аргументов & goto :EOF 
If %3 GTR 1 Echo Слишком много аргументов & goto :EOF
Robocopy %1 %2 /E /PURGE /SEC /NP /R:1 /W:1

Листинг 2. TestVar.bat

BEGIN COMMENT 
:: Для запуска сценария используйте команду
:: TestVar.bat переменная1 переменная2 переменная3.
END COMMENT
Echo Путь к сценарию: %0
Echo Первая переменная: %1
Echo Вторая переменная: %2
Echo Третья переменая: %3

Листинг 3. Test0Var.bat

BEGIN COMMENT 
:: Для запуска сценария используйте команду
:: Test0Var.bat.
END COMMENT
Call :GetPath %0
Goto :EOF

:GetPath
Echo.
BEGIN COMMENT
:: Расширяем %0 буквой диска и путем
END COMMENT
Echo Путь: %∼dp1
BEGIN COMMENT
:: Создание выходного файла по указанному пути.
END COMMENT
Set OutFile=%∼dp1outputfile.txt
Dir /AD /B > %OutFile%
Goto :EOF


Листинг 4. TestLotsOfArgs.bat

BEGIN COMMENT 
:: Для запуска сценария используйте следующую команду,
:: в которой укажите несколько имен своих серверов:
:: TestLotsOfArgs.bat Server1 Server2 Server3 Server4
:: Server5 Server6 Server7 Server8 Server9 Server10
:: Server11 Server12
END COMMENT
@Echo Off
Setlocal
Set counter=0
If '%1'=='' Echo Не заданы аргументы servername & Goto :last
Set /A counter+=1
Echo ARG %counter%) %1
Ping -n 1 %1
Set ARGStr=%1

:TOP

If '%2'=='' Goto :last
Set /A counter+=1
Echo ARG %counter%) %2
Ping -n 1 %2
Set ARGStr=%ARGStr% %2
Shift /1
Goto :TOP

:last

Echo Здесь приведена вновь собранная строка аргументов: %ARGStr%
Endlocal
Goto :EOF


Листинг 5. Фильтрация двойных кавычек

:: Call the script MyScriptWoQuotes.bat. 
"ou=server,dc=sales,dc=mycompany,dc=com"
Set ADsPath=%1
Echo Аргумент, содержащий кавычки: %ADsPath%
Set ADsPath=%ADsPath:"=%
Echo Аргумент без кавычек: %ADsPath%

Листинг 6. Фильтрация двойных кавычек с помощью команды Call

@Echo Off 
Set ADSpath="ou=server,dc=sales,dc=mycompany,dc=com"
Echo Аргумент, содержащий кавычки: %ADSpath%
Call :remquotes %ADSpath%
Goto :EOF

:remquotes
Set ADsPath=%∼1
Echo Аргумент без кавычек: %ADsPath%
Goto :EOF


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

Параметр Функция
%∼f1 Заменяет %1 на полное описание пути (fully qualified pathname)
%∼d1 Заменяет %1 на буквенное обозначение диска (только)
%∼p1 Заменяет %1 на описание пути (только)
%∼n1 Заменяет %1 на имя файла (только)
%∼x1 Заменяет %1 на расширение файла (только)
%∼a1 Заменяет %1 на атрибуты файла
%∼t1 Заменяет %1 на время/дату создания файла
%∼z1 Заменяет %1 на размер файла

Rob van der Woude's Scripting Pages

Batch files can only handle parameters %0 to %9

%0 is the program name as it was called,
%1 is the first command line parameter,
%2 is the second command line parameter,
and so on till %9.

OK, tell me something new.

Since %0 is the program name as it was called, in DOS %0 will be empty for AUTOEXEC.BAT if started at boot time.
This means that, in AUTOEXEC.BAT, you can check if it is being started at boot time or from the command line, for example to prevent loading TSRs twice.

SHIFT

The batch file’s limitation to handle parameters up to %9 only can be overcome by using SHIFT.
Let us assume your batchfile is called with the command line parameters A B C D E F G H I J K.
Now %1 equals A, %2 equals B, etcetera, until %9, which equals I.
However, %10 does not equal J but A0; %10 is interpreted as %1, immediately followed by a 0.
Does that mean the rest of the parameters is lost?
Of course not.
After your batch file handled its first parameter(s) it could SHIFT them (just insert a line with only the command SHIFT), resulting in %1 getting the value B, %2 getting the value C, etcetera, till %9, which now gets the value J.
Continue this process until at least %9 is empty.
Use a loop to handle any number of command line parameters:

@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
   •
   • Here your batch file handles %1
   •
SHIFT
GOTO Loop
:Continue
Note: IF "%1"=="" will cause problems if %1 is enclosed in quotes itself.
In that case, use IF [%1]==[] or, in NT 4 (SP6) and later only, IF "%~1"=="" instead.

In Windows NT 4, 2000 and XP you can SHIFT the command line parameters starting from the nth positions using SHIFT‘s /n switch, where n can be any (integer) number between 0 and 8:
SHIFT /4 will leave %0 through %3 untouched, and shift %5 to %4, %6 to %5, etcetera.
To use this feature, Command Extensions should be enabled.

An easy work-around in NT 4 and later is:

FOR %%A IN (%*) DO (
      •
      • Now your batch file handles %%A instead of %1
      •
)

No need to use SHIFT anymore.

Delimiters

Some characters in the command line are ignored by batch files, depending on the DOS version, whether they are «escaped» or not, and often depending on their location in the command line:

  • commas («,») are replaced by spaces, unless they are part of a string in doublequotes
  • semicolons («;») are replaced by spaces, unless they are part of a string in doublequotes
  • «=» characters are sometimes replaced by spaces, not if they are part of a string in doublequotes
  • the first forward slash («/») is replaced by a space only if it immediately follows the command, without a leading space
  • multiple spaces are replaced by a single space, unless they are part of a string in doublequotes
  • tabs are replaced by a single space
  • leading spaces before the first command line argument are ignored
  • trailing spaces after the last command line argument are trimmed

I know of several occasions where these seemingly useless «features» proved very handy.
Keep in mind, though, that these «features» may vary with the operating systems used.

More on command line parsing can be found on the PATH and FOR (especially FOR’s interactive examples) pages.

More options in Windows NT 4/2000/XP

Windows NT 4 introduced a set of new features for command line parameters:

%CmdCmdLine% will return the entire command line as passed to CMD.EXE
%* will return the remainder of the command line starting at the first command line argument (in Windows NT 4, %* also includes all leading spaces)
%~dn will return the drive letter of %n (n can range from 0 to 9) if %n is a valid path or file name (no UNC)
%~pn will return the directory of %n if %n is a valid path or file name (no UNC)
%~nn will return the file name only of %n if %n is a valid file name
%~xn will return the file extension only of %n if %n is a valid file name
%~fn will return the fully qualified path of %n if %n is a valid file name or directory
Note: %CmdCmdLine% and %* will leave all delimiters intact, except, in Windows 2000 and later, leading spaces before the first argument

Windows 2000 and XP add even more options.
More information can be found at the page explaining NT’s CALL command.

To remove the leading space of %* included by NT 4 use the following commands:

SET commandline=%*
IF NOT CMDEXTVERSION 2 SET commandline=%commandline:~1%

Validate command line arguments using GOTO

A tip by Oliver Schneider:

original code, broken in CMD.EXE (Windows NT 4 and later):

@ECHO OFF
GOTO:%~1 2>NUL
ECHO Invalid argument: %1
ECHO.
ECHO Usage:  %~n0  number
ECHO.
ECHO Where:  number may be 1, 2 or 3 only
GOTO:EOF
:1
:2
:3
REM Code to do something with the validated argument starts here
  •
  •
REM End of batch file
Note: This tip dates back to way before the Windows NT era.
In CMD.EXE (Windows NT 4 and later), a batch file exits if an invalid label is specified, unless the next line tests for ERRORLEVEL 1.

improved code for CMD.EXE:

@ECHO OFF
GOTO:%~1 2>NUL
IF ERRORLEVEL 1 (
	ECHO Invalid argument: %1
	ECHO.
	ECHO Usage:  %~n0  number
	ECHO.
	ECHO Where:  number may be 1, 2 or 3 only
	GOTO:EOF
)
:1
:2
:3
REM Code to do something with the validated argument starts here
  •
  •
REM End of batch file

For a limited number of allowed arguments, this is a time saving technique.

Do note, however, that labels are case sensitive, so you may not want to use this technique for «string type» arguments.
Also keep in mind that labels cannot contain delimiters (space, comma, semi-colon, etcetera), they must be unique, and that only the first 8 characters are used (so the first 8 characters must be unique!).

This technique is best used when each valid value for %1 has its own batch code to process it:

@ECHO OFF
GOTO:%~1 2>NUL
IF ERRORLEVEL 1 (
	ECHO Invalid argument: %1
	ECHO.
	ECHO Usage:  %~n0  number
	ECHO.
	ECHO Where:  number may be 1, 2 or 3 only
	GOTO:EOF
)

:1
REM Preprocess value 1
  •
  •
GOTO Common

:2
REM Preprocess value 2
  •
  •
GOTO Common

:3
REM Preprocess value 3
  •
  •

:Common
REM Common processing of preprocessed values
  •
  •
REM End of batch file
Note: Note the extra IF ERRORLEVEL 1 test I added.
It is required to make the code work in Windows 7 and 8 too.
  • Command Line Input Validation

page last modified: 2021-01-27; loaded in 0.0013 seconds

Аннотация: В лекции необходимо изучить способы передачи аргументов командной строки операционной системы Windows в программу, в которой предусмотрено считывание количества аргументов и вывод имен этих аргументов с возможностью запуска приложений (аргументов).

Теоретическая часть

Аргумент командной строки – это информация, которая вводится в командной строке операционной системы вслед за именем программы [21.1].

В системных средах, поддерживающих язык программирования С, существует способ передавать в программу аргументы или параметры командной строки при запуске программы на выполнение [21.2]. Для этого в главную функцию main() включают два аргумента, обычно argc и argv. Первый (от argument countсчетчик аргументов) содержит количество аргументов командной строки, с которыми была запущена программа. Второй (от argument vectorвектор аргументов) указывает на массив символьных строк, содержащих сами аргументы, – по одному в строке. В общем случае имена аргументов могут быть произвольными.

Формально можно определить следующий прототип функции main() с параметрами:

int main (int argc, char *argv[]);

Второй параметр функции main() выражает собой многоуровневую систему указателей. В связи с этим можно определить другой способ задания параметров функции main(), а именно

int main (int argc, char **argv);

Каждый указатель на значение типа char ссылается на одну из строк командной строки, при этом argv[0] указывает на имя команды (исполняемой программы), argv[1] – на первый аргумент командной строки, argv[2] – на второй аргумент и так далее [21.3].

В качестве принимаемых аргументов командной строки могут быть исполняемые файлы. Можно из программы запустить на выполнение другую программу, запустить новый процесс. Для этого существуют специальные функции библиотеки «C Run–Time Library Reference» системы Visual Studio (которую используем в качестве компилятора языка С ).

Командная оболочка операционной системы Windows использует интерпретатор команд cmd.exe, который загружает приложения и направляет поток данных между приложениями, для перевода введенной команды в понятный системе код. Консоль командной строки присутствует во всех версиях операционных систем Windows.

В среде разработки MS Visual Studio 2010 аргументы командной строки можно задать в самой среде, для чего следует произвести соответствующую настройку. Например, предположим, что мы хотим создать проект под именем tcmd, чтобы он принимал аргументы командной строки, например, «Example 1″ и E:\forma.exe. Для этого после (или во время) создания проекта обратиться к закладке, показанной на
рис.
21.1.

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

Рис.
21.1.
Пример настройки и задания аргументов командной строки

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

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

Командную строку операционной системы Windows можно запустить следующими способами:

  1. Пуск Программы (все программы) Стандартные Командная строка
  2. Пуск Выполнить (ввести) cmd

Параметры, представленные на
рис.
21.1, можно ввести из командной строки операционной системы Windows, как показано на
рис.
21.2.

Пример ввода аргументов командной строки Windows

Рис.
21.2.
Пример ввода аргументов командной строки Windows

Если подготовлена программа, в которой функция main() принимает два аргумента, то из командной строки можно передать, например, некоторые исполняемые файлы, такие как notepad.exe, winword.exe, чтобы можно было открыть «Блокнот» или документ «Word«.

Практическая часть

Пример 1. Напишите программу с аргументами командной строки, в которую передайте строки «Hello, world», «D:\forma.exe», «MS Visual Studio 2010″, «D:\knapsack.exe», «команда cmd», где исполняемый файл «forma.exe» обеспечивает форматированный вывод случайных чисел, распределенных по нормальному закону, исполняемый файл «E:\knapsack.exe» решает задачу о рюкзаке (см.Тему 18).

Аргументы командной строки определите в среде MS Visual Studio 2010.
Прежде чем реализовать программный код решения примера, приведем программный код для исполняемого файла «forma.exe».
Программный код форматированного вывода случайных чисел:

// Файл main.c программы forma (forma.exe)
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include <locale.h>
#include <string.h>

#include <math.h>
#include <float.h>
#include <limits.h>

int main (void) {
	int i, j;

	double nd, md, fd, posd;
	double factor = 1.23;
	int n, m, f, pos; // row, column, floor point, distance
	int in = 0;
	double **A = NULL;
	double S = 0.0;
	double V1, V2, R1, R2;
	double tmax, tmin;
	char *smax, *smin;
	FILE *fid;
	errno_t err;
	time_t t;

	setlocale(LC_ALL, "rus");
	setlocale(LC_NUMERIC, "uk");
     
     srand((unsigned)time(&t)); // рандомизация случайных чисел

	printf("\n Введите количество строк двумерного массива: ");
	in = scanf_s("%lf", &nd);
	 if (in != 1) {
		printf("\n Ошибка ввода. Нажмите любую клавишу: ");
		_getch();
		exit(1);
	}

	 if ( nd < 1.0 || floor(nd) != nd ) {
printf("\n Ошибка! Количество строк массива должно быть\
 натуральным числом.\n \
Нажмите любуюу клавишу: ");
		 _getch();
		 exit(1);
	 }
	 
	 if (nd > (double)(INT_MAX/10000) ) {
	 printf("\n Слишком большое число. Нажмите любую клавишу: ");
		 _getch();
		 exit(1);
	 }
	 
printf(" Введите количество столбцов двумерного массива: ");
	in = scanf_s("%lf", &md);
	 
     if (in != 1)
    {
		printf("\n Ошибка ввода. Нажмите любую клавишу: ");
		_
          getch();
		exit(1);
	}

	  if ( md < 1.0 || floor(md) != md )
     {
		 printf("\n Ошибка! Количество столбцов массива должно быть натуральным числом.\n \
Нажмите любуюу клавишу: ");
		 _getch();
		 exit(1);
	 }

	   if (md > (double)(INT_MAX/10000) )
     {
printf("\n Слишком большое число. Нажмите любую клавишу: ");
		 _getch();
		 exit(1);
	 }

	 printf(" Введите произвольное действительное число: ");
	in = scanf_s("%lf", &factor);
	 if (in != 1)
    {
		printf("\n Ошибка ввода. Нажмите любую клавишу: ");
		_getch();
		exit(1);
	}
	 if ( factor > (double)(INT_MAX/1000) || factor < (double)(INT_MIN/1000)) {
printf("\n Слишком большое число. Нажмите любую клавишу: ");
		 _getch();
		 exit(1);

	 }
	 if ( factor < (10000.0*DBL_EPSILON ) && factor > -(10000.0*DBL_EPSILON ) )
	 {
printf("\n Слишком малое число. Нажмите любую клавишу: ");
		 _getch();
		 exit(1);
	 }
	
printf(" Введите количество цифр после десятичной точки: ");
	 in = scanf_s("%lf", &fd);

	 if (in != 1) {
printf("\n Ошибка ввода. Нажмите любую клавишу: ");
		_getch();
		exit(1);
	 }
	
	 if ( fd < 0.0 || fd > 14){
printf("\n Количество цифр должно лежать в диапазоне [0; 14].\
\n Нажмите любую клавишу: ");

_getch();
exit(1);
	 }

	 if ( floor(fd) != fd )
    {
printf("\n Количество цифр должно быть целым числом \
в диапазоне  [0; 14].\n Нажмите любую клавишу: ");
_getch();
exit(1);
	 }
	 
printf(" Введите минимальное количество позиций \
между столбцами массива: ");
	 in = scanf_s("%lf", &posd);

	 if (in != 1)
     {
printf("\n Ошибка ввода. Нажмите любую клавишу: ");
		_getch();
		exit(1);
	 }
	
 if ( floor(posd) != posd )
     {
printf("\n Количество позиций должно быть целым числом \
в диапазоне  [1; 10].\n Нажмите любую клавишу: ");

_getch();
exit(1);
	 }

	 if ( posd < 0.0 || posd > 10.0)
     {
printf("\n Количество позиций должно лежать в диапазоне \
  [1; 10].\n Нажмите любую клавишу: ");

_getch();
exit(1);
	 }

f = (int)fd;
pos = (int)posd;
n = (int)nd;
m = (int)md;

	A = (double **)malloc(n*sizeof(double *));

	for (i = 0; i < n; i++)
		A[i] = (double *)malloc(m*sizeof(double));

	// Заполнение матрицы по нормальному закону
	// метод Марсальи-Брея
S = 1.0;
for (i = 0; i < n; i++) {
	for (j = 0; j < m; j++) {
		while (S >= 1.0) {
R1 = (double) rand()/RAND_MAX;
  R2 = (double) rand()/RAND_MAX;
  V1 = 2.0*R1 - 1.0;
  V2 = 2.0*R2 - 1.0;
  S = (V1*V1 + V2*V2); 

		}
			A[i][j] = factor * V1 * sqrt(-2.0*log(S)/S);
			S = 1.0;
		}
	}

tmax = tmin = A[0][0];

for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
if (tmax < A[i][j])
tmax = A[i][j];

for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
if (tmin > A[i][j])
tmin = A[i][j];

smax = (char *)malloc((pos+f+(int)INT_MAX/10000 )*sizeof(char));
sprintf_s(smax, (pos+f+(int)INT_MAX/10000 - 1),"%0.*f",f,tmax);

smin = (char *)malloc((pos+f+(int)INT_MAX/10000 )*sizeof(char));
sprintf_s(smin, (pos+f+(int)INT_MAX/10000 - 1),"%0.*f",f,tmin);
	
// int n, m, f, pos; // row, column, floor point, distance
in = (strlen(smin) > strlen(smax)? strlen(smin): strlen(smax));
 
if ((in+pos)*m < 80)
   {
	puts("\n Пример форматированного вывода числовой матрицы:");
for (i = 0; i < n; i++) {
puts("");
for (j = 0; j < m; j++)
printf("%*.*f", in + pos, f, A[i][j]);
	}

	puts("");
}

else if ((in+pos)*m < 1000)
    {
	if ( (err = fopen_s(&fid, "format.txt", "w")) != 0 ) {
printf("\n Файл для записи \"format.txt\" не может \
быть открыт.\n Нажмите любую клавишу: ");

_getch();
exit(1);
	}

fprintf(fid, "\r\n\t Пример форматированного вывода \
числовой матрицы: \r\n");
fprintf(fid, "\r\n Матрица размера %dx%d из нормально \
распределенных случайных чисел,\r\n \
умноженных на число %g. Количество цифр после \
десятичной точки: %d\r\n \
Количество позиций между числами: %d\r\n",n,m,factor,f,pos);
	for (i = 0; i < n; i++)
    {
fprintf(fid, "\r\n");
for (j = 0; j < m; j++)
fprintf(fid, "%*.*f", in + pos, f, A[i][j]);
	}
	fprintf(fid, "\r\n");
	
printf("\n Результат смотрите в файле \"format.txt\"\n" );
	fclose(fid);
}

else 
{
printf("\n Результат не может быть форматированно выведен\n \
в текстовый документ или на консоль для заданного\n \
количества столбцов, величины поля между числами\n \
и количеством знаков после десятичной точки.\n"); 
printf("\n Нажмите любую клавишу: ");

_getch();
exit(1);
}

	printf("\n\n ... Нажмите любую клавишу: ");
	_getch();
	return 0;
}

1. Командная строка Windows

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

Студентам предстоит освоить следующие навыки:

работа с файловой системой в командной строке;

создание архивных и пакетных файлов;

настройка переменных среды окружения.

На защите лабораторной работы студент должен уметь выполнять любое задание и объяснять смысл выполненной команды.

Основные понятия

Интерфейс операционной системы (ОС) — это средство общения пользователя с ОС. С помощью интерфейса пользователь обращается к различным функциям ОС, таким как запуск программ или копирование файлов, и получает сообщения ОС.

Командная строка — это интерфейс ОС, работающий в текстовом режиме следующим образом:

— ОС выводит на экран приглашение;

— пользователь вводит команду и нажимает [Enter];

— ОС выводит результаты на экран.

Приглашение к вводу команд содержит имя диска и текущий каталог, например:

C:\User\Valentin>

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

dir /b *.txt

Параметры (аргументы) командной строки — это части строки, разделенные пробелами. Их нумеруют, начиная с нуля. Нулевой параметр — это имя команды или исполняемого файла. Следующие за ним параметры указывают режим выполнения команды и сообщают имя объекта, с которым будет выполняться операция.

Команды ОС, например dir, выполняет сама ОС, поэтому на диске нет отдельных файлов для каждой команды, например dir. exe. К исполняемым файлам относятся прикладные программы (приложения) *.com и *.exe, а также пакетные файлы *.bat и *.cmd. Пакетные файлы — это текстовые файлы, содержащие последовательность команд ОС.

Регистр букв. Команды можно вводить и заглавными (большими) и строчными (маленькими) буквами — командной строке Windows это будет понятно: CD, cd, Cd, cD, см. рис.

Рис. Одна команда в разном регистре

Некоторые ОС могут различать большие и маленькие буквы в названиях команд, файлов и каталогов. Это касается и разных языков программирования.

В квадратных скобках в описании команд указывают необязательные параметры. При вводе команды сами квадратные скобки писать не нужно, см. рис.

Рис. Квадратные скобки не используем!

Квадратные скобки — это первая проверка внимательности и понимания. Если студент читает справку по команде и потом вводит квадратные скобки, значит он ничего не понял. И таких студентов с каждым годом встречается всё больше.

На самом деле в процессе обучения в вузе мы тренируем студентов читать и понимать прочитанное. В школе от учеников требуется только скорость чтения и ответов. А здесь мы требуем понимание. Придётся использовать голову не только для еды, но и для обучения.

Задание

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

Запуск командной строки

Командную строку можно запустить разными способами:

1) через главное меню Пуск:

Start — Windows System — Command Prompt

2) через поле поиска:

Type here to search — cmd — Command Prompt

4) с помощью «горячих клавиш»:

нажмите комбинацию клавиш [Win + R] — Run — cmd — [OK] или [Enter], см. рис.

Рис. Запуск командной строки

Окно командной строки содержит приглашение, содержащее полный путь к текущему каталогу. Мигающий курсор указывает место для ввода следующей команды, см. рис. Чтобы просмотреть предысторию, можно использовать полосу прокрутки.

Нажав кнопку в левом верхнем углу окна, можно изменять настройки шрифта, а также копировать и вставлять текст через буфер обмена.

Чтобы закрыть командное окно, нажмите кнопку [x] в правом верхнем углу окна либо введите на клавиатуре команду exit — «выйти». В переводе эта команда могла бы звучать так: «Закройте это окно!»

Рис. Окно командной строки

Задание

— Запустите командную строку описанными способами.

— Настройте размер шрифта и цвет текста и фона.

— Введите команду ver и нажмите [Enter].

— Запишите версию ОС.

— Найдите в командном окне все элементы интерфейса:

— — Приглашение

— — Мигающий курсор

— — Команду

— — Ответ ОС

— — Полосу прокрутки

— Закройте командное окно.

Справочная система

Команда help выводит на экран описание указанной команды. Например, чтобы изучить команду dir, нужно ввести команду:

help dir

Длинный текст справки выводится на экран постранично.

Некоторые команды и программы сами могут выводить справку при указании вопросительного знака в качестве параметра:

dir /?

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

dir [диск: ]

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

dir

dir c:

dir d:

Задание

Вызовите справку для команды dir описанными выше способами.

История ввода команд

Все команды, введенные течение текущего сеанса работы командного окна, сохраняются в памяти. Их можно вернуть стрелками [Вниз] и [Вверх] и снова выполнить.

Содержимое командной строки можно редактировать клавишами [Влево], [Вправо], [Home], [End], [Del], [BackSpace].

Клавиша [Backspace] находится на клавиатуре над клавишей [Enter]. Эта клавиша удаляет символ слева от курсора.

Английское слово backspace означает «вернуться на одну позицию назад». Эта клавиша была ещё на печатных машинках, см. рис. Тогда она просто передвигала печатающую головку на один символ влево. Русское название — «Забой». Можно было вернуться и напечатать другую букву поверх первой — если надо было исправить ошибку — то есть «забить» одну букву другой, перепечатать символ. А теперь на компьютере это ещё и стирание символа слева от курсора — с той же целью — исправить опечатку.

Обратите внимание на расположение букв на клавишах печатной машинки и на компьютерной клавиатуре. И для этого есть причина. В центре расположены буквы, которые встречаются чаще всего — чтобы не приходилось далеко передвигать пальцы при печати. Ближе к краям находятся более редкие буквы.

Клавиша «Забой» тоже осталась на своём привычном месте.

Рис. Клавиша «Забой» на печатающей машинке

Клавиша [Del] удаляет символ справа от курсора.

Для полного удаления текущей команды нажмите [Esc].

Задание

— Используя клавиши [Up] и [Down], просмотрите историю ввода.

— Верните команду help dir

— Отредактируйте команду, чтобы получить help help

— Нажмите [Enter]

— Верните предыдущую команду

— Нажмите [Esc]

— Прочитайте описание [Backspace] на Википедии

Команда DIR

Для просмотра содержимого каталога используется команда dir. Английское слово directory переводится как «каталог, папка, директория».

На экран выводится список всех каталогов и файлов, находящихся в текущем каталоге диска с указанием их расширения и размеров, даты и времени создания, см. рис.

Каталоги помечаются символами <DIR>.

Примеры использования команды:

dir /b — вывод только названий файлов

dir /d — вывод списка в несколько колонок

dir /oe-s — отсортированный по расширениям список имен каталогов и файлов, а среди них — сортировка от больших файлов к меньшим.

Рис. Содержимое каталога

Задание

— Введите следующие команды:

dir

dir c:\

dir /b c:\

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

— Вызовите справку для команды dir

— Выведите на экран список файлов и каталогов диска D:, отсортированных по расширению в обратном алфавитном порядке;

— Выведите на экран список файлов и каталогов диска D:, отсортированных по дате — от ранних к поздним

— Выведите на экран список файлов и каталогов диска D:, сгруппировав каталоги после файлов

— Выведите на экран в алфавитном порядке имена скрытых файлов

— Выведите на экран в алфавитном порядке имена системных файлов

Команда CD

Для перехода из каталога в каталог используют команду cd. Это сокращение от английских слов Change Directory — «смените каталог».

Как и многие другие команды ОС, это выражение действительно звучит как команда в армии: «Рядовой Петров, смените каталог!»

Команда cd без параметров выводит имена текущего диска и папки.

Примеры использования команды:

cd c:\tmp — переход в каталог c:\tmp из любого каталога диска c:

cd /d c:\tmp — переход в каталог c:\tmp из любого каталога любого диска

cd tmp — переход в подкаталог tmp, расположенный в текущем каталоге

cd.. — переход на один уровень выше по дереву файлов

cd \ — переход в корневой каталог текущего диска

d: — переход на диск D:

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

В приглашении ОС каждый раз после выполнения любой команды выводится имя текущего диска и каталога — если не изменить настройки командной строки.

Задание

— Вызовите справку для команды cd

— Обратите внимание на использование кавычек в команде cd

— Используя команды cd и dir, переходите вверх и вниз по файловому дереву диска с:

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

— Установите текущий диск d:

— Переходите вверх и вниз по файловому дереву диска d:

— Перейдите в каталог C:\Program Files с одновременной сменой диска и каталога

— Перейдите в корневой каталог

Команда TREE

Команда tree выводит на экран схематичное изображение дерева каталогов. Английское слово Tree означает «дерево», а также «забраться на дерево». В нашем случае это слово означает «вывести на экран схему дерева файловой системы».

Если не указаны диск или путь, на экран выводится часть дерева, начиная с текущего каталога.

Чтобы прервать вывод на экран, нажмите сочетание клавиш [Ctrl + C].

Примеры:

tree \ — вывод дерева каталогов всего диска C:

tree c:\ /f more — постраничный вывод дерева диска C:

Задание

— Вызовите справку для команды tree

— Введите команду tree

— Введите команду tree и нажмите [Ctrl + C]

— Введите команду tree с постраничным выводом

— Сделайте зарисовку части дерева диска C:, начиная с корневого каталога

Команда SET

Команда set (англ. Set — «установите значение, задайте состояние, настройте») позволяет просматривать и изменять переменные (параметры) среды окружения (англ. Environment variables — «переменные окружения»). Имеется в виду среда выполнения программ.

Переменные окружения — это настройки ОС, доступные для прикладных программ в виде текстовых строк в оперативной памяти. Их также называют так: set-параметры.

К переменным окружения обращаются по имени.

Команда set без параметров выводит текущие значения переменных среды окружения, см. рис.

Вот некоторые примеры переменных окружения:

HOMEDRIVE — диск, на котором находится домашний каталог

HOMEPATH — путь к домашнему каталогу

NUMBER_OF_PROCESSORS — число логических процессоров, то есть процессоров, ядер и т. п.

OS — операционная система или семейство ОС

PATH — путь поиска исполняемых файлов

PROMPT — формат приглашения командной строки

USERNAME — имя пользователя

Рис. Параметры окружения

Для обращения к значению переменной окружения используют символ процента. Например, %os% — значение переменной os.

Примеры:

set path=C:\Temp;%path% — добавление каталога C:\Temp в путь поиска

echo %os% — вывод на экран значения переменной OS

Задание

— Выведите полный список переменных окружения

— Определите число «процессоров»

— Определите тип операционной системы

— Выясните в Википедии, что такое Windows NT

— Определите имя пользователя

— Выведите путь для поиска

— Добавьте каталог d:\ в путь для поиска

— Выведите путь для поиска

— Выведите полный список переменных окружения

— Убедитесь, что значение переменной path изменилось

Команда PATH

Команда path (англ. Path — «путь») устанавливает путь для поиска исполняемых файлов. Если при запуске приложения полный путь к файлу не указан, ОС пытается найти исполняемый файл в текущем каталоге, а затем просматривает пути к каталогам из заранее заданного списка path.

Список путей для поиска хранится в переменной среды окружения PATH. Для просмотра списка путей используется команда path без параметров.

Примеры:

path — выводит список путей

path c:\usr; d:\bin — задание двух путей для поиска

path %path%; d:\s — добавляет каталог d:\s к пути поиска

Изменение set-параметров из командной строки действует только для текущего командного окна. После изменения путей для поиска ОС не сможет выполнять некоторые команды. Для восстановления работоспособности закройте текущее командное окно и откройте новое.

Задание

— Выведите список путей поиска

— Добавьте каталог c:\1 в список путей

— Выведите список путей поиска

— Убедитесь, что каталог добавлен в список

Создание файлов

Обычно системный администратор ограничивает права рядового пользователя — чтобы тот не испортил работающую систему.

Например, пользователю могут запретить создание файлов в корневом каталоге диска c:\. Рекомендуется проводить опыты с файлами на другом диске в своём каталоге, например d:\sidorov.

Для создания текстовых файлов в командной строке можно использовать два способа.

Способ 1. Копирование ввода с клавиатуры в файл:

copy con file. txt

При выполнении этой команды данные с клавиатуры записываются в указанный файл. Для завершения ввода текста нажмите комбинацию [Ctrl + Z], а затем [Enter].

con (англ. Console — «Консоль») — устройство стандартного ввода-вывода информации. «Стандартный ввод» выполняется с клавиатуры, а «стандартный вывод» — на экран.

Способ 2. Перенаправление стандартного вывода:

echo текст> file. txt

Команда echo (англ. Echo — «эхо») выводит текст, напечатанный после команды, на экран.

Символ «больше» направляет вывод вместо экрана в файл. В результате, при выполнении этой команды будет создан файл file. txt, который будет содержать в себе текст, напечатанный после команды echo.

Задание

— Просмотрите в Википедии статью Консоль, которая относится к компьютерам

— Создайте на рабочем диске свой рабочий каталог и назовите его своей фамилией

— Перейдите в свой рабочий каталог

— Создайте текстовый файл a. txt с помощью копирования с консоли в файл.

— Создайте текстовый файл b. txt с помощью перенаправления стандартного вывода.

Вывод на экран

Команда type выводит на экран содержимое текстового файла (например, *.txt или *.bat), например:

type f. txt

Можно также выполнить копирование файла на экран (устройство стандартного вывода, консоль), например

copy f. txt con

Задание

— Выведите на экран файл a. txt командой type

— Выведите на экран файл b. txt командой copy

Команда COPY

Команда copy (англ. copy — «скопируйте, создайте копию») используется, чтобы скопировать один или несколько файлов. Первый параметр команды — исходный файл (источник). Второй параметр — результат копирования (каталог или новый файл). Например, команда copy f1.txt d:\t копирует файл f1.txt в каталог d:\t.

Для объединения нескольких файлов в один файл между именами файлов ставится знак +. Например команда

copy f1+f2+f3 f4

объединяет файлы f1, f2 и f3 в файл f4

Второй параметр команды может содержать имя файла или путь к файлу.

Примеры:

copy 1.txt 2.txt — копирование файла 1.txt в файл 2.txt в текущем каталоге. Если файл с именем 2.txt уже существует в этом каталоге, то его содержимое заменяется содержимым файла 1.txt. Перед копированием ОС запрашивает согласие пользователя на замену существующего файла.

copy 1.txt d:\t\2.txt — копирование файла 1.txt в файл 2.txt в каталоге d:\t

Звездочка * заменяет любой символ или несколько символов в названии файла. Например, команда copy *.txt d:\ копирует все файлы с расширением txt в каталог d:\.

Задания

— Скопируйте файл a. txt в каталог d:\

— Выведите на экран файл d:\a. txt

— Скопируйте файл a. txt в d:\z. txt

— Выведите на экран файл d:\z. txt

— Скопируйте файл b. txt в файл c. txt

— Выведите на экран файл c. txt

— Скопируйте файл a. txt в файл c. txt

— Выведите на экран файл c. txt

— Скопируйте файлы a. txt и b. txt в файл c. txt

— Выведите на экран файл c. txt

— Скопируйте все файлы типа txt в файл d. txt

— Выведите на экран файл d. txt

Работа с архивами

Архив — это файл, внутри которого упакованы каталоги и файлы. Архиватор — это программа, которая выполняет упаковку и распаковку архивов. Многотомный архив — это большой архив, разбитый на несколько частей. Такие архивы можно записать на несколько дисков или отправить частями по сети.

Самораспаковывающийся архив SFX (SelF-eXtracting archive) — это исполняемый файл *.exe, содержащий архив и программу распаковки. При запуске такого файла производится распаковка архива без использования дополнительной программы-архиватора.

В лабораторной работе используется программа 7-zip — свободно распространяемый архиватор.

Сайт программы:

https://www.7-zip.org/

Чтобы запускать архиватор из командной строки, необходимо добавить в путь поиска каталог C:\Program Files\7-Zip

При вызове архиватора ему передают команду — первую букву английского слова, например

add

list

extract

Примеры использования архиватора:

7z a x1 b. txt — упаковка файла b. txt в архив x1.7z

7z l 1.7z — вывод списка файлов из архива 1.7z

7z e 1.7z — извлечение файлов из архива 1.7z

7z e 1.7z — od:\ — извлечение файлов в каталог d:\

7z a — sfx rr *.txt — сжатие всех текстовых файлов в самораспаковывающйся архив rr. exe

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

7z <command> [<switches>…] <archive_name> [<file_names>…]

означает, что пользователь может вводить такие команды:

7z a ghjk

7z l ghjk

7z a ghjk a. txt

7z a — sfx ghjk b.doc b. txt

Задания

— Выясните, в каком каталоге находится архиватор 7-zip

— Выведите на экран путь поиска

— Добавьте путь для поиска архиватора

set path=%path%;C:\Program Files\7-Zip

— Выведите на экран путь поиска

— Убедитесь, что путь добавлен

— Введите команду 7z и прочитайте справку по использованию архиватора

— Выясните назначение и перевод команд a, e, l

— Упакуйте файл с. txt в архив сс.7z

— Сравните размеры исходного и сжатого файлов

— Создайте текстовый файл tt.docx в редакторе MS Word

— Упакуйте файл tt.docx в архив t1.7z

— Сравните размеры исходного и сжатого файлов

— Упакуйте все файлы с расширением *.txt в архив ttt.7z

— Выведите список файлов из архива ttt.7z

— Распакуйте архив ttt.7z в каталог d:\

— Убедитесь, что операция выполнена успешно

— Упакуйте файл tt.doc в саморапаковывающийся архив в каталоге d:\

— Сравните размеры исходного и сжатого файлов

— Перейдите в каталог d:\

— Запустите созданный архивный файл на выполнение

— Убедитесь, что операция выполнена успешно

Перенаправление ввода-вывода

При выполнении программ в командной строке используется так называемый стандартный ввод-вывод. Это стандартные встроенные функции ОС для ввода текста с клавиатуры и вывода текста на экран. Такие действия выполняются, например, при использовании команд printf и scanf в программе на языке C.

Для перенаправления стандартного ввода-вывода используют следующие символы:

> — записать в файл (вместо вывода на экран);

>> — добавить к файлу (вместо вывода на экран);

< — прочитать из файла (вместо ввода с клавиатуры);

— объединить две команды в конвейер (вместо вывода на экран и ввода с клавиатуры).

Стандартный ввод

Если в параметрах командной строки не указано имя файла, то команда принимает данные с клавиатуры. Например, команда sort сортирует текстовые строки по алфавиту. Команда sort без параметров сортирует текст, вводимый с клавиатуры до нажатия [Ctrl+Z] и [Enter]. Команда sort f. txt сортирует текст из файла f. txt. Команда dir> f. txt отправляет список файлов в файл f. txt вместо вывода на экран. Команда dir>> f. txt дописывает список файлов в конец файла f. txt, если этот файл уже существует.

Конвейер

При организации конвейера стандартный вывод первой команды (вместо вывода на экран) направляется на стандартный ввод второй команды (вместо чтения с клавиатуры). Например, конвейер dir sort создает список файлов, сортирует его и выводит на экран.

Команда more организует постраничный вывод на экран. При организации конвейера в виде tree more, команда more перехватывает вывод на экран результатов работы команды tree и выводит длинный текст по страницам. При работе с командой more для вывода на экран следующей строки нажимают [Enter], для вывода следующей страницы — пробел [Space], для выхода из страничного просмотра — клавишу [Q] (англ. Quit — «выйти»).

Задания

— Вызовите команду dir и запишите результаты в файл d4.txt

— Выведите файл d4.txt на экран

— Вызовите команду ver и добавьте результаты к файлу d4.txt

— Выведите файл d4.txt на экран

— Выведите файловое дерево в постраничном режиме

Пакетные файлы

Пакетный файл — это текстовый файл с расширением *.bat (англ. Batch — «пакет»). В пакетном файле записывают последовательность команд ОС. Имеется также возможность составления несложных программ.

Хотя пакетный файл содержит текст, он является исполняемым файлом. Чтобы запустить пакетный файл из командной строки, нужно ввести его имя и нажать [Enter]. При этом расширение указывать не обязательно.

Для запуска файла или команды в отдельном окне используется команда start, например:

start dir

Задание

— Выведите справку по команде date

— Командой echo создайте пакетный файл da.bat, в котором содержится команда вывода на экран текущей даты

— Запустите файл da.bat на выполнение, указав расширение

— Запустите файл da.bat на выполнение, не указав расширение

— Запустите файл da.bat на выполнение в отдельном окне

— Перейдите в корневой каталог диска D:

— Запустите на исполнение файл da.bat без указания пути

— Ознакомьтесь с сообщением ОС

— Добавьте к пути поиска полный путь к каталогу, где находится файл da.bat

— Убедитесь, что путь поиска изменен

— Запустите на исполнение файл da.bat без указания пути

— Убедитесь, что файл успешно запущен

Работа с файлами и каталогами

Для создания каталогов используется команда mkdir (англ. Make Directory — «Создайте каталог»).

Для удаления каталогов используется команда rmdir (англ. Remove Directory — «Удалите каталог»).

Для удаления фалов используется команда del (англ. Delete — «Удалите»).

Задания

— Вызовите справку по mkdir

— Создайте каталог (в названии используйте номер группы)

— Перейдите в новый каталог

— Создайте каталог (в названии используйте фамилию)

— Перейдите в новый каталог

— Создайте текстовый файл

— Вызовите справку по del

— Удалите текстовый файл

— Поднимитесь на один уровень вверх по файловому дереву

— Вызовите справку по rmdir

— Удалите каталог

— Создайте каталог

— Поднимитесь на один уровень вверх по файловому дереву

— Удалите каталог

Управление процессами

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

Для вывода списка процессов используется команда tasklist (англ. Task List — «Составьте список задач (процессов)»).

Для остановки выполнения процесса используется команда taskkill (англ. Task Kill — «Убейте задачу, остановите выполнение указанного процесса»).

Для остановки процесса требуется указать идентификатор процесса PID (англ. Process Identifier — «Идентификатор процесса»). PID — это «уникальное» целое число, назначенное каждому процессу. У всех процессов эти номера разные.

Задание

— Выведите на экран список процессов

— Определите, какой процесс занимает больше всего памяти

— Определите номер процесса cmd. exe

— Запустите второе командное окно

— Выведите список процессов

— Определите номер второго процесса cmd. exe

— Определите, сколько памяти занимает каждый процесс cmd. exe

Конец ознакомительного фрагмента.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Отличия профессиональной от максимальной windows 7
  • Windows 10 как закрыть зависшее полноэкранное приложение
  • Как узнать где находится загрузчик windows 10
  • Программа для управления жесткими дисками для windows 10
  • Putty windows server 2003