Текущая папка запуска в cmd. / The current start-up folder in cmd.

Описание

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

Active connections, ports, etc

The go-to command for listing active connections and listening ports is netstat.

To find info on a specific port, you could use something like netstat -bnao | grep «8080» (or find, if lacking git-bash). You can then go a step further, and take a PID from that output and use tasklist /fi «pid eq PID_from_netstat» to get process info. Or use taskkill /F /PID PID_from_netstat to kill the process.

Asking for input

You can pause your script and ask for input by using this:

Example:

Automatically receiving calling input

In a .bat file, you can automatically receive and use the input that was provided when the file was called by using %1, %2, and so on.

Capturing output to variable

Kind of complicated in Windows…

The popular «trick» seems to be to use:

For details see:

Clearing environment variables

If the value was set via SET instead of SETX, then you could just spawn a new terminal instance to be in an environment with fresh value. If you want to clear a value set via setx, and/or don’t want to spawn a new terminal, the options to delete an environmental variable depend on what you want:

Converting paths to forward slashed

If you have git-bash, or something like that which includes the sed program, that is a fast solution:

Copy files

There are a bunch of built-in tools. In order of online recommendations:

Copying to the clipboard

You can use CLIP to copy anything to the clipboard. For example,

Delete files of a certain type within current folder and all subfolders

Batch:

Else if

Else If can be problematic with .bat batch scripts. Might work in CMD, but for BAT, seems most people recommend nested IFs as alternative, or GOTOs. Worked fine for me though, with Win 8

Error handling

There are multiple ways to handle errors in batch scripts.

Evaluating symlinks

If you want to check what a symlink maps to (or just see if there are any in the current dir), you can use:

dir /a, or for just links, dir /aL

File permissions

You can use TAKEOWN to take ownership of files.

Example:

Find executable paths

Use where to find files, as well as global executable / binary paths.

For example, where npm to find which NPM executables are globally registered in the path.

Сейчас читают:  Снятие и установка топливораспределительной рампы и форсунок (двигатель К4М) | Двигатель | Руководство Renault

This is roughly equivalent to Unix’s / bash’s which command.

Global variables / macros

This page has a comprehensive list of standard global environmental variables, and their default values. Also, lots of relevant tips for FOR variable syntax here.

If / else

The basics:

Including line breaks — complex escape sequence

Ouch.

Including line breaks — stored variable with delayed expansion

Above code based on this and this.

Joining string vars

Same as bash, you can just put them together:

Hello World

And you can also put variables inside strings:

Hello World

Keeping file open after execution

Add this to very end of file:

Output text to file

  • Redirect operator
    • ipconfig /all > output.txt
  • Double redirect for append mode
    • ipconfig /all >> existingOutput.txt

Passing input arguments to another program

If you need to pass trailing input arguments to another program, you can use %*.

For example, if I wanted to create a stub file in a bin folder that simply calls another, I could do something like this:

By the way, this is how NodeJS handles cmd files in the .bin folder — they use this syntax to call node your-file.js your-args.

For more details, see SS64 — Pass Command Line Arguments to a Windows Batch File

Purposefully including line breaks in strings

Including line breaks in strings and variables is a little complicated with cmd / bat. There are multiple approaches, listed below in detail. For a good summary, this is a great S/O response.

Reading from the clipboard

Unfortunately, there is no built-in command for reading from the clipboard in Windows, at least in command prompt. There is a tool built-in to PowerShell though; Get-Clipboard.

If you really need this functionality in CMD, you can always execute the Powershell command from command prompt:

Refreshing environment variables

Environment variables, by default, cannot be read back in a console if they were set after the console was launched. E.g., if you launch two consoles and then call setx in one to set a value, neither of the two consoles can read back the value that was just set, and you would have to either restart each one to read the value, or spawn a new console (which is the same thing).

This a serious shortcoming of how environment variables work on Windows, but there are some workaround scripts, many good ones in the answers to this StackOverflow question.

Sadly, the best solution in many cases still, is to simply grab a fresh console.

In ConEmu / Cmder, you can save the pain of restarting the entire Cmder instance by using Menu -> Active Console -> Restart or duplicate -> Restart [...]. Or, you can even create a hotkey for the action (under hotkeys, it is listed as: Recreate active console)

Removing line breaks with string manipulation syntax

Similar to the above approach for removing quotes, you can use the string manipulation syntax to replace line breaks with nothing, thus removing them.

Credit to this S/O

Removing quotes from string variables

To remove quotes from a variable, use set VAR_NAME=%VAR_NAME:»=% (ref)

Removing trailing line breaks and empty lines — set

Removing a trailing empty line is, like many things in CMD, not as simple as many of us would like.

If you are looking for completely native option and have not yet saved or captured the output, the agreed upon method seems to be to use set /p (credit to S/O):

Resources

Or, if you want the comments to show up in execution, use it without the @:

Setting environmental variables

Use either the set command (temporary) or setx command (persisted).

Сейчас читают:  Что скрывает МГСА

Cmd:

🚨 Notice that set has a different syntax than setx.

🚨 👉 SETX edits will only take effect in new console sessions, not the current one. See section below on refreshing environment variables.

«set» vs «setx»? Set is temporary — variable is set for duration of console session, whereas setx persists the value, even after you close the console.

Powershell:

Symlinking

On Win, you can use MKLink (ss64) to create a symlink to a directory or file.

  • Link to a file:
    • MKlink {symbolicFileName} {realTargetFile}
  • Link to a directory / folder
    • MKlink /D {symbolicDirName} {realTargetDir}

Tasklist

  • Find process by exe name
    • tasklist /FI "IMAGENAME eq Greenshot.exe"
  • Kill process by exe name
    • taskkill /IM {EXE_NAME}
      • Basically same thing as above: tasklist /FI "IMAGENAME eq {EXE_NAME}"
    • Optional: /F for «force»

Unicode issues with clip

The windows terminal has notorious issues with codepoints above the standard ascii range (e.g. emoji).

The fix for CLIP is the same for as using Unicode with the command prompt in general; change the code page using chcp 65001.

There is a PR I found that is a great illustrative solution — node-copy-and-paste PR #45.

Using environmental variables

Same syntax as using variables — %ENV_VAR_NAME%.

Example: cd %APPDATA%

🚨 👉 Environment variables, by default, cannot be used in a console that was spawned before their values were set. See below.

Using variables

WARNING: Be careful about wrapping variables in quotes; you can end up accidentally nesting quotes / double quoting.

If you are trying to use a path directly to access contents (for example, with in (filename.txt), you won’t want quotes around the string)

Verifying checksums

A built in utility that you can use is CertUtil.

For example:

If you are looking for a GUI approach, check out hashcheck. Or this list of Windows freeware hash programs.

Since CertUtil can only hash files (not piped or stored strings), to check an online file (via cURL), clipboard contents, or any other strings, you would need to temporary save to a file and then pass the file to CertUtil.

🚨 WARNING: Be really wary of how easy it is to accidentally add or include newlines and/or extra spacing in the content you are trying to generate a hash from. If you accidentally add one in the shell that is not present in the content, the hashes won’t match.

If you want to quickly hash / encode strings with a GUI, I highly recommend the CyberChef online tool. Here is an example recipe for SHA256 Base64.

Waiting for a process to finish in a batch script

Usually using the call command is the most reliable way to start a process or script and wait for it to finish:

Another option that sometimes works is using the start command, specifically with wait

💡 StackOverflow: CALL vs START /WAIT

More advanced example of START

Добавить 1

Только что нашел хорошую ссылку для загадочного~ оператора тильды.

%~Строка называется процентом тильды оператора. Вы можете найти его в таких ситуациях , как: %~0.

:~Строка называется двоеточием тильды оператора. Вы можете найти это как %SOME_VAR:~0,-1%.

Добавить 2 — 13:12 7/7/2022

%1-%9обратитесь к аргументам командной строки. Если они не являются допустимыми значениями пути, %~dp1- %~dp9все будут расширены до того же значения, что и %~dp0. Но если они являются допустимыми значениями пути, они расширятся до своего собственного значения драйвера / пути.

Например: (batch.bat)

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

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

Сейчас читают:  Где производят Рено Логан для России и других стран

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

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

Параметры командной строки

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

Файл Cmd.exe разворачивает переменные с %0 по %9. При использовании пакетных параметров переменная %0 заменяется на имя пакетного файла, а переменные с %1 по %9 — на соответствующие аргументы, напечатанные в командной строке. Для доступа к переменным больше %9 запустите команду shift.

Например, для копирования содержимого из папки 1 (Folder1) в папку 2 (Folder2), где параметр %1 заменяется на значение Folder1, а параметр %2 — на значение Folder2, в пакетном файле с именем Mybatch.bat введите следующую строку:

xcopy %1*.* %2

Для запуска файла введите:

mybatch.bat C:folder1 D:folder2

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

xcopy C:folder1 *.* D:folder2

Примечания

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

Текущая папка запуска в cmd. / the current start-up folder in cmd.

При создании скрипта cmdиногда возникает необходимость запустить тот или иной файл для установки приложения в папке со скриптом.

Для запуска приложения в текущей папке скриптом cmdиспользуется переменная:

%~dp

current_folder

На изображении показан пример запуска скрипта cmdиз другой папки. Сам скрипт состоит из двух строк, а именно:

echo %~dp

pause

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

Пример скрипта инсталляции программы Winrarиз папки где находится сам скрипт:

«~%dp0wrar521ru.exe» /s

Внимание ! Переменная %~dp0 работает только в cmd файле, а не в командной строке.

Переменная %~dp может использоваться как при инсталляции приложений, так и для копирования файлов в ваших bat файлах.

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

When you create a cmd script, sometimes you need to run a particular file to install the application in the folder with the script.

To run the application in the current folder, the cmd script uses a variable:

%~dp0

current_folder

The image shows an example of running cmd script from another folder. The script itself consists of two lines, namely:

echo %~dp

pause

Running the script from any location will refer to the path where the script is located.

Example script installation Winrar from the folder where the script itself:

«~%dp0wrar521ru.exe» /s

Attention! The %~dp0 variable only works in the cmd file, not on the command line.

The variable %~dp0 can be used both for installing applications and for copying files.

I hope this information will help you in the preparation of their scripts. We will be glad if you repost this article in social networks.

Закладка Постоянная ссылка.
1 ЗвездаНельзя так писать о ЛоганеЧто-то о новом Логане так себе написаноЛоган - супер машинаРено Логан лучше всех! (Пока оценок нет)
Загрузка...