10 CMD tips and tricks
Tags: shell, terminal, tips, tricks
Published: 2020-09-16 14:52:52

I think I'm a little obsessed with the windows command line. It all started when I began learning Python. I would learn a command to do something and then just kept picking up commands here and there. Now I almost live in the terminal. It is the first application that I open everyday. I believe I have reached a level terminal wizardry where I almost never have to reach for my mouse and or touch pad.

There are plenty commands that I know of and even more that I am yet to discover but for now I only want to discuss the commands that **I personally** found useful and use on a regular basis.

# Basics :baby:
If you are just starting learn the command line yourself you should know the commands
- `cd`
- `dir`
- `mkdir`
- `del` and
- `rmdir`

These are basic commands for navigating, creating and removing files and folders. I'm going to assume that you know these and what they do as well as what *flags* are. 

Now that that is out of the way. Let's get into my *terminal tips and tricks*.

# My Goto Commands :upside_down_face:

## 1. Help :question: 

First up is the `help` command. This is just about as useful as a command gets. Simply enter `help` in the terminal and you should see a list of basic commands and a brief description of what they do. Here's an example of what the output would look like.

![help command](https://dev-to-uploads.s3.amazonaws.com/i/swa0qnphnghmb1fu1dy3.PNG)

Whenever you stumble across a new command you and want to know more about it and how to use it, you can try `help` followed by that new command or use the `/?` flag with the command. This should give you a more in depth explanation of that new command, and examples of how to use of it. 

![help assoc command](https://dev-to-uploads.s3.amazonaws.com/i/mjviwc2nmd6ckeo4kh40.PNG)

## 2. Cls

This command clears the terminal. If you ever just get annoyed with a long list of output and just want to get rid of without having to start a new terminal session, you can instead use `cls` and this way you keep the history of commands that you entered. Here is what that would look like!

![clearing console gif](https://dev-to-uploads.s3.amazonaws.com/i/j24uh6riky6y3ajaoopz.gif)

I can't emphasis the `cls` command enough. It is so simple but effective. I don't know why but I can't go 2 seconds without clearing my console. Every now and then I just find myself entering cls into the google search bar out of habit:joy:. 

When I started out using the command line no one really told me about this command. I think it is so basic that they might have forgotten about. So from me to you, have fun with this one. Honestly, if you know `cd` and `dir` and `cls` you're already halfway to terminal wizardry.

## 3. Tab

Everyone knows that if you press the up and down arrow keys you can revisit your command history, but no one really speaks about the power of the **Tab** key. The tab key cycles through your files and folders within you current directory. It also predicts what file you are trying to refer to. So if you have long file or folder names and you want to reference it in a command all you need to do is type in the first 1 or 2 letters and hit **Tab** and CMD will predict which file you want to reference in your command.

![gif of tab](https://dev-to-uploads.s3.amazonaws.com/i/1uecrw9flnj6076xlejn.gif)

Note:pencil: If you enter a file as a command into the prompt, windows will open the file with its default application. For example, if I were to type `index.html` into the terminal, windows will open *sublime text* and load the HTML file. This is one of the reasons why *command prompt* is the first application I start up everyday. 

## 4. Start 

The command, `start`, by itself will simply start a new terminal session. But if you pass it in a parameter it will start that specific program. Enter `start `+ nameofprogram.exe and you the program will startup. And this is another reason why I always start the day by opening the terminal. From there I just navigate to the files I want to open and open the programs I need to work with :upside_down_face:.

## 5. Tasklist

This command displays a list of all current running processes or tasks. I like to think of it as a task manager within the command prompt. I find it useful when I want to know the name of a programs executable so that I start it up with `start`

`Tasklist` is also useful for determining which programs are memory hogs and determine which processes are still running that you should not be. If you ever accidently write up a python script that starts an infinite loop, you can see that python file running in the tasklist command.

![tasklist terminal output](https://dev-to-uploads.s3.amazonaws.com/i/ku2hdvzbhzlr8tkl3qm6.PNG)

Hint: A programs' executable filename will usually be the name of the programe with a *'.exe'* extension. E.g. Firefox is simply *firefox.exe* and chrome is *chrome.exe*. But there are exceptions like Microsoft word, which is *winword.exe*, and Microsoft powerpoint, which is *powerpnt.exe*. If you wanted to startup these applications using the `start` command, you only need to pass in the base of the filename of a program as a parameter. For example

```
start chrome
start firefox
start powerpnt
start winword
```

## 6. Taskkill

Without `tasklist`, this command wouldn't be very useful. It is used to terminate processes or programs. Just like we need the name of a programs exectuble to start that program we need the name of it to close it with `taskkill`.

To terminate a task according to its process id you use the `/pid` flag and to terminate a task according to its name the you use the `/im` flag. I think the *im* stands for image. Or at least that's how I remember it.

The scenario which you would find me using this command the most is to terminate a program that is NOT RESPONDING! :roll_eyes: I don't know why after I click the exit button aggressively, windows doesn't get the hint that I want to close the program. And it has the audacity to ask me whether I want to wait for the program to respond!

![gif of frustration](https://media.giphy.com/media/MZFdDAqsFpUGQlxEP2/giphy.gif)

Anyway, if the taskkill is not working, you can try force closing the application. We can use the `/f` flag to force close programs. For example.

```
taskkill /f /im powerpnt.exe
taskkill /f /pid 2020
```

## 7. Echo

I take it you already know this command, but I'll go over it because I think its special. Now we all know that `echo` simply prints output to the terminal but did you also know that it can be used to create and overwrite or append to files?

The syntax is as follows

```
echo Hello world! > Hello.txt
```

After entering the above command in the terminal you should see a file called Hello.txt in your current directory even if it was not there before. If you then open the file "Hello.txt", it should contain the text "_Hello world!"_.  

## 8. Type

So many times I have come across a tutorial where the tutor uses **Linux** and they majestically creates files using the `touch` command. It took me a while but I finally found the windows alternative to `touch`. Now, echo and type are similar but they are different so do not confuse the two.

What `type` does is print the contents of a file to the terminal. In other words here is a standard HTML file.

![Picture of standard html file](https://dev-to-uploads.s3.amazonaws.com/i/gohi3jahoui65yt08dp1.PNG)

And here is what gets output to the terminal when I enter `type index.html` in the terminal.

![Type index.html terminal ouptut](https://dev-to-uploads.s3.amazonaws.com/i/iqihz2h1k558y314c4rv.PNG)

But this has got nothing to do with creating files. So why mention it? Knowing the purpose behind types helps distinguish the difference between the type and the echo commands. Just to reiterate, Type displays contents of a file and can create a new file, whereas echo simply prints texts to the terminal or a file.

The syntax of the type command: 
```
type nul > afile.txt
```

`echo` can also be used in the same way, but it will actually write the characters _nul_ into the textfile. If you leave it empty then 

The arrow character, `>`, **overwrites** a file completely. It takes what is left of the arrow and places it into the the referenced file, which would be *afile.txt* in this case. 

But If you wanted to append to the the file, you must use the double arrow: `>>`. The double arrow takes what is left of the arrow and **appends** it to the referenced file. If I enter the following sequence of commands in my terminal.

```
type nul > hello.py

echo Hello world > hello.py
echo "How are you? > hello.py

echo Hello world > hello.py
echo How are you? >> hello.py
```

Now if we enter `type hello.py` the contents of our file should be

![type hello.txt terminal ouput](https://dev-to-uploads.s3.amazonaws.com/i/kji3y0smj4dr9td8rgla.PNG)

## 8. Title :writing_hand:

When you open a new terminal session the title of that session will be a path of the cmd.exe file 

![without title terminal default title](https://dev-to-uploads.s3.amazonaws.com/i/e1uyihwfd1s0fxliz1km.PNG)

Title allow us to change the title of a terminal window. If you are like me and open multiple terminal sessions at different directories, switching back and forth between them can be confusing. I find it helpful to give them distinct names instead of the default directory title.

When I work on web development projects I open 2 terminal sessions, One I use to run a local development server with `npm start` and the other to create new files and folders and manage them with `git`. 

![Portfolio](https://dev-to-uploads.s3.amazonaws.com/i/fzgslinyo5achanxlqvr.PNG)
![server](https://dev-to-uploads.s3.amazonaws.com/i/r3vtd1fp2pgf4k4762u0.PNG)

# Tricks And Things :man_cartwheeling:

Technically some the following still falls under commands but I put it in a separate category because they are not stand alone commands.

I have no idea what the name of this "\|" symbol is so I'll call it a pipe. Piping commands is a way to redirect output. You can use this in a lot of ways but I mainly just use it for the 2 commands, `more` and `clip`. 

## 9. | more

Once you get familiar with the terminal, you will quickly realise that it is searching through large output is tedious and time consuming. If you want to be thorough, you can pipe the output to the `more` command. It formats output to the size of the terminal so that you can go through each line of output and press hit to move down one line at time.

```
tasklist | more
```

![tasklist | more terminal output](https://dev-to-uploads.s3.amazonaws.com/i/c1wja18zfcifndowwiwg.PNG)

Once you have found what you are looking for you can press `q` so to skip through the entire output.

## 10. | clip :clipboard:

`clip` copies output to your clipboard. You should know that Ctrl+C does not allow you to copy text but you must instead right click and select copy. `clip` is a great way to get around this but because it copies the entire output, you don't have much room to select which part of the output you want to copy. Either way I found it useful

```
cd | clip 
tasklist | clip 
type hello.txt | clip
``` 

There are probably more use cases for clip but I only use it to copy the current directory that I am in so that I don't have to retype the entire path when starting a seperate terminal session.


### Bonus: file explorer :file_folder:

This one is for the people that simply can't stand to navigate through the command line:nauseated_face:, or people that can never seem to remember their folder structure thus rendering the `cd` command useless. This trick isn't even that fancy but I think a lot of people don't know about it because of how simple it is.

To open the command prompt at a specific directory, open the File Explorer and navigate the directory you wish to start the terminal session in. Once you are in said directory, click on the path, which should be at the top of your screen to the left of the search bar, and simply enter `cmd.exe`. And voila! Your terminal session will start in said path.

[picture of url bar]()

An alternative would be to right click on a **folder** and open the command prompt

![Select prompt](https://dev-to-uploads.s3.amazonaws.com/i/uiccsxwu3f7kjgp63lul.PNG)

# :pencil: General advice...

If you want to learn a command then **practice** using it. Once you find it useful it will become more difficult to forget. Also, some commands are harder to grasp than others, for example, taskkill took me a while to understand but after doing it a couple of times it has become nothing more than a reflex. 

There are lot of interesting commands that I left out simply because I don't know them well enough or I didn't find them useful at this particular time in my programming journey. If you love the terminal and learned a command recently, share it in the comments below.

Other commands that I find useful but simply don't use often enough to include in this blog are

- color
- set
- setx
- xcopy
- at

I think these commands are worth knowing either that or I simply haven't got around to learning them yet. 

The command line can be a dangerous place. All it takes is `del **` and you can say goodbye to the contents of your current directory. But if you know what you're doing it can increase your productivity a lot. There are so many more commands I want to learn I just thought I'd share some them for those who are as enthusiastic as I am :wink:.

# Closing

To be honest, my computer is really slow. I mean really slow. I mean so slow that if it were to get any slower it would start going backwards. The command line, however, is light on memory. So as much as many of these commands can be done with the click of a mouse, I save a lot time with these commands.

I know this post was unusually long, I thought I could break it up to a series in order to get more views but I don't think it really matters. I just need this to be out there. I have been quite sluggish of late and I need a win. I consider posting an achievement. And if you got this far I consider that an even bigger achievement. If you find my content useful or at the very least amusing:upside_down_face: then I thank you. I hope all is well with you, Stay safe and Happy Coding!:computer: