Web development on Windows can be perceived by some developers as clunky due to the lack of proper native tooling. While Command Prompt, also known as cmd.exe
, is less than ideal for an efficient development workflow, modern Windows systems come packed with the mighty Windows PowerShell, a command-line shell that includes an interactive prompt and a scripting environment.
PowerShell gives you access to the file system on the computer, lets you make server requests, and much more! However, guidance on running development tasks is often provided for MacOS and Linux only. To support Windows users, this guide demonstrates how to perform common web development tasks using PowerShell.
Use the navigation sidebar to jump to any section of your interest. Bookmark that section for future reference if you'd like!
Getting Help
At any point, if you need information about any PowerShell command or concept, you can use the Get-Help
command to display this information in the console:
Get-Help
[[-Name] <String>]
[<CommonParameters>]
You can pass to Get-Help
the command that you need information about. To make using Get-Help
easier, you can use the help
function which runs Get-Help
internally but displays the result one page at a time.
Example
Display basic information about Get-Item
one page at a time:
Get-Help Get-Item | Out-Host -Paging
To exit the manual, press q
.
For a less complex command, you may use help
:
help Get-Item
To get an example of the command usage, pass the -example
flag:
help Get-Item -example
Pass the -online
flag to open the PowerShell online document for the command:
help Get-Item -online
In the example above, the following URL opens in the default browser to show the Get-Item
document page:
Getting Your Current Location
To print information about your current working directory in the console, use Get-Location
or gl
.
Aliases
pwd
, which is commonly used in UNIX-based operating systems.
Examples
This command prints your location in the current PowerShell drive.
PS C:\Users\User\Projects\powershell> Get-Location
Path
----
C:\Users\User\Projects\powershell
PS C:\Users\User\Projects\powershell> gl
Path
----
C:\Users\User\Projects\powershell
PS C:\Users\User\Projects\powershell> pwd
Path
----
C:\Users\User\Projects\powershell
Seeing Previous Activity
To get a list of the commands entered during the current session, use Get-History
.
Get-History
[[-Count] <Int32>]
This command takes a -Count
or -c
parameter to specify the number of most recent commands used that should be displayed.
Aliases
You can use the familiar UNIX command history
as well as ghy
and h
.
Examples
Get the full history of the current session:
PS C:\Users\User\Projects\powershell> Get-History
Id CommandLine
-- -----------
1 help Get-History -online
2 cd .\Projects\
3 ls
4 cd .\powershell\
5 ls
6 rd .\test\
7 rd .\test1\
8 ls
9 help Get-Location -Examples
10 pwd
11 help Get-History -Examples
12 Get-History
13 history 2
Get the two most recent entries of the current session:
PS C:\Users\User\Projects\powershell> history -c 2
Id CommandLine
-- -----------
13 history 2
14 Get-History
Printing the last command used
To print the last command used, execute $$
:
PS C:\Users\User\Projects\powershell> $$
history
Printing to the Console
You can use Write-Output
to print to the console.
Write-Output
[-InputObject] <PSObject[]>
Aliases
You can use the more familiar echo
command instead as well as write
.
Examples
To get information about your home directory:
PS C:\Users\User\Projects\powershell> echo $HOME
C:\Users\User
PS C:\Users\User\Projects\powershell> write $HOME
C:\Users\User
Print a string:
PS C:\Users\User\Projects\powershell> echo "PowerShell is life"
PowerShell is life
Set a variable and print it:
PS C:\Users\User\Projects\powershell> $value = "Shell Life"
PS C:\Users\User\Projects\powershell> echo $value
Shell Life
Creating Multi-Line Commands
To make long commands easier to write, read, copy, and paste, you can spread them over multiple lines using the backtick (`
) as newline delimiter:
npm i @fortawesome/fontawesome-svg-core `
@fortawesome/free-solid-svg-icons `
@fortawesome/react-fontawesome
Copying and pasting this command in PowerShell will execute the three lines as a one-line command.
Viewing Content of Directories
To view the content of the current working directory, use the Get-ChildItem
or gci
command.
You can also pass it a directory path to see the content present at the end of the path.
Get-ChildItem
[[-Path] <string[]>]
The -Path
parameter is implied.
Aliases
You can also use the familiar UNIX ls
command as well as the familiar cmd.exe
command dir
.
Examples
To view the content of the current directory:
PS C:\Users\User\Projects\powershell> gci
PS C:\Users\User\Projects\powershell>
# the directory is empty
To view the content of a nested directory, simply provide the path as an argument:
PS C:\Users\User\Projects\powershell> gci frameworks
If the frameworks
subdirectory exists, the above command lets you see its content in the console.
Viewing hidden files
To view hidden files you add the -Force
flag to Get-ChildItem
or gci
, or any of its aliases.
Viewing File Content
To output the content of a file right to the console, use the Get-Content
or gc
command.
Get-Content
[-Path] <string[]>
The -Path
parameter can be omitted.
Aliases
You can also use the familiar UNIX cat
command as well as type
.
Examples
Print the content of a package.json
file present in the current directory:
PS C:\Users\User\Projects\powershell> gc .\package.json
{
"name": "powershell",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
Directory Operations
Creating a directory
- The
New-Item
command can be used to create directories when given the right arguments.
New-Item
[-Path] <String[]>
-Name <String>
[-ItemType <String>]
The -Path
parameter receives as value the location path of the new item. If omitted, the current directory would be used as the default path.
The -Name
parameter takes the name you want to give to the directory. You can omit it and simply pass a string at the end of the command.
The value of the -ItemType
parameter is "directory". This parameter may also be simplified to -it
.
Aliases
ni
is the alias for New-Item
.
Examples
Create a directory named frameworks under the current directory:
New-Item -ItemType "directory" frameworks
Shorthand version:
ni -it "directory" frameworks
Create two more directories, languages, and os, under the current directory. To create multiple directories, pass their path as a comma-separated list:
ni -it "directory" languages, os
Create a subdirectory whose parent exists:
PS C:\Users\User\Projects\powershell> ni -it "directory" languages/javascript
Directory: C:\Users\User\Projects\powershell\languages
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/13/2019 4:12 PM javascript
PS C:\Users\User\Projects\powershell> gci .\languages\
Directory: C:\Users\User\Projects\powershell\languages
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/13/2019 4:12 PM javascript
Assuming that the subdirectory employers doesn't exist, create a subdirectory named auth0 that would be its child:
PS C:\Users\User\Projects\powershell> ni -it "directory" employers/auth0
Directory: C:\Users\User\Projects\powershell\employers
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/13/2019 4:14 PM auth0
PS C:\Users\User\Projects\powershell> gci .\employers\
Directory: C:\Users\User\Projects\powershell\employers
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/13/2019 4:14 PM auth0
Additional Aliases
md
and mkdir
are also aliases for New-Item
that already assume the ItemType
to be "directory"
.
md [<Drive>:]<Path>
mkdir [<Drive>:]<Path>
The mkdir
command is popularly used in tutorials online that target UNIX systems.
Deleting a directory
To delete any directory, use the Remove-Item
command.
Remove-Item
[-Path] <String[]>
[<CommonParameters>]
As before, -Path
is an optional parameter with the current directory being its default value.
Alias
You can use any of the following aliases with this command: ri
, rm
, rmdir
, del
, erase
, and rd
.
Examples
Remove the os subdirectory created earlier:
PS C:\Users\User\Projects\powershell> Remove-Item os
If you try to delete a directory that is not empty, instead of failing, PowerShell will warn you about it and give you the option to delete the directory recursively:
PS C:\Users\User\Projects\powershell> ri .\languages\
Confirm
The item at C:\Users\User\Projects\powershell\languages\ has children
and the Recurse parameter was not specified.
If you continue, all children will be removed with the item.
Are you sure you want to continue?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
It lets you choose from different options:
[Y] Yes
[A] Yes to All
[N] No
[L] No to All
[S] Suspend
[?] Help
(default is "Y"):
You can press enter to go with the Y
default.
To delete a subdirectory, just provide the path.
Moving a directory
To move a directory you can use the Move-Item
command. It moves the directory, including its properties, contents, and child items, from one location to another location.
Move-Item
[-Path] <String[]>
[[-Destination] <String>]
The -Path
parameter specifies the path to the current location of the directory. If omitted, its default value is the current directory.
The -Destination
parameter specifies the path to the location where the directory should be moved. When omitted, its default is the current directory.
Aliases
You can use the following aliases for this command: mi
, move
, and the common UNIX command, mv
.
Examples
Create a subdirectory named angular under the current directory and move it to the frameworks sibling subdirectory:
PS C:\Users\User\Projects\powershell> ni -it "directory" angular
Directory: C:\Users\User\Projects\powershell
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/13/2019 4:36 PM angular
PS C:\Users\User\Projects\powershell> mi .\angular\ .\frameworks\
PS C:\Users\User\Projects\powershell> gci
Directory: C:\Users\User\Projects\powershell
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/13/2019 4:14 PM employers
d----- 3/13/2019 4:36 PM frameworks
PS C:\Users\User\Projects\powershell> gci .\frameworks\
Directory: C:\Users\User\Projects\powershell\frameworks
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/13/2019 4:36 PM angular
Renaming directories
To rename a directory, you can use the same command to move a directory, Move-Item
. You need to supply the same path to the directory but with a different name.
Examples
Rename the subdirectory angular inside the subdirectory frameworks to react:
PS C:\Users\User\Projects\powershell>
mi .\frameworks\angular\ .\frameworks\react
PS C:\Users\User\Projects\powershell>
gci .\frameworks\
Directory: C:\Users\User\Projects\powershell\frameworks
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/13/2019 4:36 PM react
Copying directories
To copy a directory from one location to another, use Copy-Item
.
Copy-Item
[-Path] <String[]>
[[-Destination] <String>]
The -Path
parameter specifies the path to the current location of the directory. If omitted, its default value is the current directory.
The -Destination
parameter specifies the path to the location where the directory should be copied. When omitted, its default is the current directory.
Aliases
You can use cpi
, copy
, and the familiar UNIX cp
as aliases for Copy-Item
.
Examples
Create the spring
subdirectory inside the frameworks
subdirectory and then copy it to the employers
directory:
PS C:\Users\User\Projects\powershell>
ni -it "directory" .\frameworks\spring
Directory: C:\Users\User\Projects\powershell\frameworks
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/14/2019 1:51 PM spring
PS C:\Users\User\Projects\powershell>
gci .\frameworks\
Directory: C:\Users\User\Projects\powershell\frameworks
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/13/2019 4:36 PM react
d----- 3/14/2019 1:51 PM spring
PS C:\Users\User\Projects\powershell>
cpi .\frameworks\spring\ .\employers\
PS C:\Users\User\Projects\powershell>
gci .\employers\
Directory: C:\Users\User\Projects\powershell\employers
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/13/2019 4:14 PM auth0
d----- 3/14/2019 1:52 PM spring
File Operations
The commands used to perform directory operations can be used to perform file operations as well.
Creating files
New-Item
can be used to create a file. Be sure to provide the extension.
-ItemType
can be omitted as its default value is to create a file.
New-Item
[-Path] <String[]>
-Name <String>
[-ItemType <String>]
Aliases
ni
is the alias for New-Item
.
Examples
Create a file named index.js under the current directory
PS C:\Users\User\Projects\powershell>
ni index.js
Directory: C:\Users\User\Projects\powershell
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 1:56 PM 0 index.js
PS C:\Users\User\Projects\powershell>
gci
Directory: C:\Users\User\Projects\powershell
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/14/2019 1:52 PM employers
d----- 3/14/2019 1:51 PM frameworks
-a---- 3/14/2019 1:56 PM 0 index.js
Create a file named main.java inside the frameworks/spring subdirectory:
PS C:\Users\User\Projects\powershell>
ni .\frameworks\spring\main.java
Directory: C:\Users\User\Projects\powershell\frameworks\spring
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 1:58 PM 0 main.java
PS C:\Users\User\Projects\powershell>
gci .\frameworks\spring\
Directory: C:\Users\User\Projects\powershell\frameworks\spring
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 1:58 PM 0 main.java
If the directory where you want to create the file doesn't exist, executing the following command throws an error:
PS C:\Users\User\Projects\powershell>
ni .\frameworks\django\main.py
ni : Could not find a part of the path
'C:\Users\User\Projects\powershell\frameworks\django\main.py'.
At line:1 char:1
+ ni .\frameworks\django\main.py
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (C:\Users\User\P...\django\main.py:String) [New-Item], DirectoryNotFoundException
+ FullyQualifiedErrorId : NewItemIOError,Microsoft.PowerShell.Commands.NewItemCommand
However, adding the -Force
or -f
parameter at the end lets you create both the directory and file within the same command:
PS C:\Users\User\Projects\powershell>
ni .\frameworks\django\main.py -f
Directory: C:\Users\User\Projects\powershell\frameworks\django
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 2:00 PM 0 main.py
PS C:\Users\User\Projects\powershell>
gci .\frameworks\
Directory: C:\Users\User\Projects\powershell\frameworks
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/14/2019 2:00 PM django
d----- 3/13/2019 4:36 PM react
d----- 3/14/2019 1:58 PM spring
Creating multiple files
To create multiple files, the New-Item
or ni
command is used and paired with the -Path
parameter. You can provide a comma-separated list of file paths as the value of -Path
to create multiple files at once.
Examples
Create the files App.js, App.css, and index.css under the frameworks/react subdirectory:
PS C:\Users\User\Projects\powershell>
ni .\frameworks\react\App.js,`
.\frameworks\react\App.css,`
.\frameworks\react\index.css
Directory: C:\Users\User\Projects\powershell\frameworks\react
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 2:02 PM 0 App.js
-a---- 3/14/2019 2:02 PM 0 App.css
-a---- 3/14/2019 2:02 PM 0 index.css
If any of the intermediate folders don't exist, you can use the -Force
or -f
parameter to create them:
If a command starts to get long, use the backtick (
`
) to spread it into multiple lines
Deleting files
To delete files you can use the same command used to delete directories: Remove-Item
.
Remove-Item
[-Path] <String[]>
[<CommonParameters>]
Aliases
You can use any of the following aliases with this command: ri
, rm
, del
, erase
, and rd
.
Examples
Delete the main.java file present inside the frameworks/spring subdirectory:
PS C:\Users\User\Projects\powershell>
ri .\frameworks\spring\main.java
PS C:\Users\User\Projects\powershell>
gci .\frameworks\spring\
# empty subdirectory
Deleting multiple files
To delete multiple files, pass a list of comma-separated file paths to Remove-Item
or ri
.
Examples
PS C:\Users\User\Projects\powershell>
ri .\frameworks\react\App.css, .\frameworks\react\App.js
PS C:\Users\User\Projects\powershell>
gci .\frameworks\react\
Directory: C:\Users\User\Projects\pwsh\frameworks\react
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/27/2019 7:43 PM 0 index.cs
-a---- 3/27/2019 7:49 PM 0 index.css
It deletes the files but not the intermediate react folder.
Moving files
To move a file, you can use the same commands used to move directories: Move-Item
. You just need to specify the filename in the path.
Move-Item
[-Path] <String[]>
[[-Destination] <String>]
Aliases
You can use the following aliases for this command: mi
, move
, and the common UNIX command, mv
.
Examples
Move the index.js from the current directory to the frameworks/angular subdirectory:
PS C:\Users\User\Projects\powershell>
gci
Directory: C:\Users\User\Projects\powershell
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/14/2019 1:52 PM employers
d----- 3/14/2019 2:09 PM frameworks
-a---- 3/14/2019 1:56 PM 0 index.js
PS C:\Users\User\Projects\powershell>
mi .\index.js .\frameworks\angular\
PS C:\Users\User\Projects\powershell>
gci
Directory: C:\Users\User\Projects\powershell
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/14/2019 1:52 PM employers
d----- 3/14/2019 2:09 PM frameworks
PS C:\Users\User\Projects\powershell>
gci .\frameworks\angular\
Directory: C:\Users\User\Projects\powershell\frameworks\angular
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 1:56 PM 0 index.js
Renaming files
To rename a file, use the same command to move a directory, Move-Item
. You need to supply the same path to the directory but with a different filename.
Examples
Rename the index.js file under the frameworks/angular subdirectory to index.ts:
PS C:\Users\User\Projects\powershell>
mv .\frameworks\angular\index.js .\frameworks\angular\index.ts
PS C:\Users\User\Projects\powershell>
gci .\frameworks\angular\
Directory: C:\Users\User\Projects\powershell\frameworks\angular
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 1:56 PM 0 index.ts
Copying files
The same command used to copy directories is used to copy files: Copy-Item
. The only difference is that now you must specify the filename at the end of the path:
Copy-Item
[-Path] <String[]>
[[-Destination] <String>]
The -Path
parameter specifies the path to the current location of the file. If omitted, its default value is the current directory.
The -Destination
parameter specifies the path to the location where the file should be copied. When omitted, its default is the current directory.
Aliases
You can use cpi
, copy
, and the familiar UNIX cp
as aliases for Copy-Item
.
Examples
Copy the file frameworks/react/index.css file to the subdirectory frameworks/angular/:
PS C:\Users\User\Projects\powershell>
gci .\frameworks\angular\
Directory: C:\Users\User\Projects\powershell\frameworks\angular
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 1:56 PM 0 index.ts
PS C:\Users\User\Projects\powershell>
cpi .\frameworks\react\index.css .\frameworks\angular\
PS C:\Users\User\Projects\powershell>
gci .\frameworks\angular\
Directory: C:\Users\User\Projects\powershell\frameworks\angular
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 2:02 PM 0 index.css
-a---- 3/14/2019 1:56 PM 0 index.ts
Creating hidden files
To create a hidden file, create the file first and then add "Hidden" as one of its attributes.
Example
PS C:\Users\User\Projects\pwsh>
ni .env
Directory: C:\Users\User\Projects\pwsh
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/27/2019 8:02 PM 0 .env
PS C:\Users\User\Projects\pwsh>
(gi .\.env).Attributes += 'Hidden'
PS C:\Users\User\Projects\pwsh>
gci
Directory: C:\Users\User\Projects\pwsh
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/14/2019 5:28 PM employers
d----- 3/14/2019 7:53 PM frameworks
d----- 3/14/2019 5:18 PM languages
(gi .\.env)
returns the .env
file as an object. Then, you can change its Attributes
property. Remember that gi
is the shorthand for Get-Item
.
"Learn how to create, delete, copy, and move files and directories using Windows PowerShell."
Tweet This
Navigating the Filesystem
To move to a subdirectory, you can use the Set-Location
or sl
command. However, using the cd
alias is more natural and universal among technical documentation.
cd
works just like in UNIX. Pass as an argument to this command the path where you want to go:
PS C:\Users\User> cd .\Projects\
PS C:\Users\User\Projects>
# takes you to the Projects subdirectory
PS C:\Users\User\Projects> cd .\powershell\frameworks\
PS C:\Users\User\Projects\powershell\frameworks>
# takes you two folders down to the frameworks subdirectory
PS C:\Users\User\Projects\powershell\frameworks> cd ..
PS C:\Users\User\Projects\powershell>
# takes you back one level up to the powershell subdirectory
PS C:\Users\User\Projects\powershell> cd ../..
PS C:\Users\User>
# takes you two levels up to the User directory
PS C:\Users\User> cd .\Projects\powershell\frameworks\angular\
PS C:\Users\User\Projects\powershell\frameworks\angular> cd ~
PS C:\Users\User>
# cd ~ takes you to the defined home directory
Combining Commands
To combine commands use a semicolon (;
).
Create a new hardware subdirectory and make it the current directory:
PS C:\Users\User> cd .\Projects\powershell\
PS C:\Users\User\Projects\powershell>
ni -it "directory" hardware; cd hardware
Directory: C:\Users\User\Projects\powershell
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 3/14/2019 2:32 PM hardware
PS C:\Users\User\Projects\powershell\hardware>
It's important to note that the second command will run even if the first one fails. Assume that the hardware folder exists but the colleges folder doesn't. The following commands attempts to create a new file within each of these folders:
PS C:\Users\User\Projects\powershell>
ni colleges\mit.html; ni hardware\macbook.html
ni : Could not find a part of the path
'C:\Users\User\Projects\powershell\colleges\mit.html'.
At line:1 char:1
+ ni colleges\mit.html; ni hardware\macbook.html
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (C:\Users\User\P...lleges\mit.html:String) [New-Item], DirectoryNotFoundException
+ FullyQualifiedErrorId : NewItemIOError,Microsoft.PowerShell.Commands.NewItemCommand
Directory: C:\Users\User\Projects\powershell\hardware
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 2:35 PM 0 macbook.html
Since the colleges folder doesn't exist, the first command, ni colleges\mit.html
, fails and throws an error in the console. However, the second command, ni hardware\macbook.html
, executes successfully and creates the file macbook.html within the hardware folder.
This is the same exact behavior that &
has in cmd.exe
.
Finding a File in a Directory
You can also use Get-ChildItem
or gci
to search if a file is present in the given directory.
Examples
PS C:\Users\User\Projects\powershell>
gci App.css
If App.css is present in the current working directory, you'll see information about the file printed on the screen. Otherwise, you'll see an error like this one:
gci : Cannot find path 'C:\Users\User\Projects\powershell\App.css' because it does not exist.
At line:1 char:1
+ gci App.css
+ ~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\User\P...ershell\App.css:String) [Get-ChildItem], ItemNotFoundExcep
tion
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
To search within the current directory and subdirectories for the file, you need to pass along the -Recurse
and -Force
parameters:
PS C:\Users\User\Projects\powershell>
gci App.css -Force -Recurse
If the file is present in the tree below the current directory, its information is printed on the console, which includes its locations:
Directory: C:\Users\User\Projects\powershell\frameworks\angular
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 2:02 PM 0 App.css
Directory: C:\Users\User\Projects\powershell\frameworks\react
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/14/2019 2:02 PM 0 App.css
Adding Content to a File
To add content to a file, use Add-Content
. PowerShell commands are very declarative.
Add-Content
[-Path] <string[]>
[-Value] <Object[]>
The -Path
parameter specifies the path to the items that receive the content. You can omit it and pass the path as a value to Add-Content
directly.
The -Value
parameter specifies the content to be added. If passing a string, you can omit it and simply provide the content to add as a quoted string after the path value. This will be clear in the examples.
Aliases
You can also use ac
instead.
Examples
Add a the ".auth0 {}" string to the App.css file present in frameworks/react:
PS C:\Users\User\Projects\powershell>
gc .\frameworks\react\App.css
PS C:\Users\User\Projects\powershell>
ac .\frameworks\react\App.css ".auth0 {}"
PS C:\Users\User\Projects\powershell>
gc .\frameworks\react\App.css
.auth0 {}
Finding Text Within Files
Use Select-String
or sls
to find files that include certain text.
Select-String
[-Pattern] <string[]>
You need to pipe files to Select-String
.
The -Pattern
parameter specifies the text to find on each file line. You can use a string or a regular expression as its value. However, if you pass it a string, use the SimpleMatch
parameter.
Examples
To search for the occurrence of the "auth0" string within the current directory and its subdirectories, use the following:
PS C:\Users\User\Projects\powershell>
gci -Recurse | Select-String -Pattern "auth0"
auth0
frameworks\react\App.css:1:.auth0 {}
As you learned before, gci -Recurse
is used to traverse the current directory and subdirectories. That output is then passed to Select-String
for it to detect within all those files an occurrence of the string "auth0". When the operation is complete, you'll see printed in the console a list of the files with their location and the line that contains the pattern.
Comparing Two Files
To compare the contents of two files and determine if they are identical in content, you can use the Compare-Object
command.
Compare-Object
[-ReferenceObject] <PSObject[]>
[-DifferenceObject] <PSObject[]>
Compare-Object
takes as arguments the reference object and the difference object.
Aliases
You can also use diff
and compare
as aliases.
Examples
Use Compare-Object
to find if two files are identical:
Compare-Object `
-ReferenceObject $(Get-Content package.json) `
-DifferenceObject $(Get-Content clone.json)
If the files differ, you'll see the following output:
InputObject SideIndicator
----------- -------------
"name": "react", =>
"name": "node", <=
If they are identical, there's no output.
You have to execute the Get-Content
command for each file, as Compare-Object
compares two sets of objects. For files, Get-Content
reads one line at a time and then returns a collection of objects, each of which represents a line of content. These object collections are then used by Compare-Object
to determine any differences in content.
To execute commands within commands, you can use the following syntax:
$(<command to execute>)
For example, if you want to print to the screen what Get-Content
returns, run the following:
echo $(Get-Content package.json)
Marking Server Requests
Probably the most commonly used commands in tech tutorials online are curl
and wget
. These commands are used to get content from a web page online or make requests to servers. Fortunately, PowerShell offers an equivalent command to achieve this task: Invoke-WebRequest
.
Invoke-WebRequest
[-UseBasicParsing]
[-Uri] <Uri>
This command is very powerful and can do a lot. You'll learn how to use it to make basic requests to a server.
Aliases
To make your life easier, Invoke-WebRequest
has wget
and curl
as aliases. You can also use iwr
.
Examples
Let's say that you have a Node Express web server running on localhost:8080
. The server has an /api/users
endpoint that handles GET
and POST
requests.
To make a GET
request, use the following command:
PS C:\Users\User>
curl "http://localhost:8080/api/users"
StatusCode : 200
StatusDescription : OK
Content : ["Tony","Lisa","Michael","Ginger","Alice"]
RawContent : HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 42
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Mar 2019 22:14:50 GMT
ETag: W/"2a-X4GgAs2DaZWDhw7cuMCCGMiGj58"
X-Powered-By:...
Forms : {}
Headers : {[Connection, keep-alive], [Content-Length, 42], [Content-Type, application/json; charset=utf-8],
[Date, Thu, 14 Mar 2019 22:14:50 GMT]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : System.__ComObject
RawContentLength : 42
If you do a curl
, you may get the following error:
curl : The response content cannot be parsed because the Internet Explorer
engine is not available, or Internet Explorer's
first-launch configuration is not complete.
Specify the UseBasicParsing parameter and try again.
This means that Internet Explorer has not been launched for the first time in your Windows system. To solve it, launch Internet Explorer and choose to use the recommended settings.
To make a POST
request, you can first define the body of the request using a variable named $Body
:
PS C:\Users\User> $Body = @{
>> name = 'alice'
>> lastName = 'jones'
>> }
To create the object, type
$Body = @{
and then press<ENTER>
to define its properties as shown above.
Then you can use this $Body
variable with the -Body
parameter to make the POST
request as follows:
PS C:\Users\User>
curl "http://localhost:8080/api/users" -Method "POST" -Body $Body
StatusCode : 200
StatusDescription : OK
Content : OK
RawContent : HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 2
Content-Type: text/plain; charset=utf-8
Date: Thu, 14 Mar 2019 22:31:34 GMT
ETag: W/"2-nOO9QiTIwXgNtWtBJezz8kv3SLc"
X-Powered-By: Express...
Forms : {}
Headers : {[Connection, keep-alive], [Content-Length, 2], [Content-Type, text/plain; charset=utf-8], [Date, Thu,
14 Mar 2019 22:31:34 GMT]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : System.__ComObject
RawContentLength : 2
The -Method
parameter specifies the HTTP method used for the web request. It can accept any of the HTTP verbs.
The -Body
parameter specifies the body of the request.
"Learn how to make server requests using Windows PowerShell!"
Tweet This
Checking the Integrity of Downloaded Packages
Go to https://www.jetbrains.com/webstorm/download/download-thanks.html
and download the WebStorm installer. You'll use it as an example of how to verify the integrity of a file.
In the download page, JetBrains suggests to:
Download and verify the file SHA-256 checksum.
Clicking on the SHA-256 checksum
link opens a basic page that shows the following output:
62196e17f1965c97d2c32bf30fadaf7935168933de6ecf23483acfc8bd4a90c6 *WebStorm-2018.3.5.exe
This checksum can help you determine that the file you downloaded hasn't been tampered by anyone during transmission and it's the file JetBrains intended for you to download.
Once the file is downloaded, you can make the Downloads
folder your current directory and issue the following command to compute the hash of the downloaded file:
certutil -hashfile .\WebStorm-2018.3.5.exe SHA256
Certutil.exe
is a CLI tool used to verify certificates, key pairs, and certificate chains.
Upon completion, the command prints the following to the screen:
SHA256 hash of .\WebStorm-2018.3.5.exe:
62196e17f1965c97d2c32bf30fadaf7935168933de6ecf23483acfc8bd4a90c6
CertUtil: -hashfile command completed successfully.
You can then compare this output with the checksum provided by JetBrains on their site. If the file name and the hash match perfectly, you can be assured that you downloaded the right file.
Running Commands as Administrator
You can manually start PowerShell as administrator by right-clicking on its desktop entry and choosing "Run as Administrator" or selecting that from its right menu options. That action opens a console that has elevated access and permissions.
However, you can also start an elevated console through a command in PowerShell:
Start-Process powershell -Verb runAs <process>
This command starts a process with the runAs
verb, which in turn starts the process with permissions of a system admin.
For example, to start PowerShell as an administrator you can run the following command:
Start-Process -FilePath "powershell" -Verb RunAs
Using Shell File Editors
If you are feeling adventurous, you can always download Vim for Windows and use it inside PowerShell.
Further Reading
Getting Started with Windows PowerShell
Understanding important PowerShell concepts
PowerShell Microsoft.PowerShell.Core module providers that manage the basic features of PowerShell
Recap
As a Windows developer, PowerShell provides you with the same capabilities that any terminal application for MacOS and Linux have.
Are there any other tasks that this guide should include or tasks that could be run better with different syntax or commands? Please let me know in the comments below if you have any insights to share! I am loving using PowerShell while making cool web apps.
About Auth0
Auth0 by Okta takes a modern approach to customer identity and enables organizations to provide secure access to any application, for any user. Auth0 is a highly customizable platform that is as simple as development teams want, and as flexible as they need. Safeguarding billions of login transactions each month, Auth0 delivers convenience, privacy, and security so customers can focus on innovation. For more information, visit https://auth0.com.