# Basics of Powershell Commands

## 1. What is cmdlet?

Cmdlet là các lệnh tích hợp sẵn trong PowerShell, dùng để thực hiện các tác vụ quản trị hệ thống. Chúng thường có cú pháp dạng “Động từ-Danh từ” để thực hiện một hành động cụ thể. Ví dụ, cmdlet “Get-Process” trả về danh sách các tiến trình đang chạy, còn “Stop-Process” dùng để dừng một tiến trình cụ thể.

Dưới đây là một số cmdlet cơ bản có sẵn trong PowerShell mặc định để minh họa:

<figure><img src="/files/EUH1fTSdsyGtAJrmJsje" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/RVsznxofbQnI4nvnDjYe" alt=""><figcaption></figcaption></figure>

## 2. Powershell Script?

Ngoài cmdlet, PowerShell còn cho phép tạo và chạy các script (kịch bản). Một PowerShell script thường có đuôi file `.ps1` và chứa các cmdlet cùng các biểu thức PowerShell khác để tự động hóa các tác vụ phức tạp.

Để chạy một script, bạn sử dụng tên và đường dẫn của nó kèm theo `.\`. Ví dụ, lệnh `.\myScript.ps1` sẽ chạy script có tên "`myScript.ps1`" trong thư mục hiện tại.

PowerShell script hỗ trợ các tính năng như biến, vòng lặp và câu lệnh điều kiện, giúp thực hiện các thao tác phức tạp.

## 3. Data Types in Powershell

Giống như các ngôn ngữ lập trình/kịch bản khác, PowerShell hỗ trợ nhiều kiểu dữ liệu và biến. PowerShell có tích hợp trực tiếp với .NET Framework, cho phép sử dụng tất cả các tính năng của môi trường .NET. Vì vậy, PowerShell hỗ trợ tất cả các kiểu dữ liệu mà .NET hỗ trợ.

Dưới đây là một số kiểu dữ liệu phổ biến trong PowerShell mà chúng ta sẽ sử dụng nhiều trong công việc hàng ngày:

<figure><img src="/files/1k9vl0nBxDorQHesRAeK" alt=""><figcaption></figcaption></figure>

Kiểu dữ liệu **`PSCustomObject`** được thiết kế đặc biệt cho PowerShell, cho phép người dùng tạo các đối tượng tùy chỉnh với một hoặc nhiều thuộc tính thuộc các kiểu khác nhau. Trong khi các kiểu dữ liệu khác quen thuộc từ ngôn ngữ lập trình, **`PSCustomObject`** là duy nhất cho PowerShell và giúp người dùng định nghĩa các đối tượng theo nhu cầu riêng.

Để tạo một **`PSCustomObject`**, bạn sử dụng cú pháp `@{}` (Hashtable). Ví dụ:

```powershell
$customObject = [PSCustomObject]@{
    Name = "John Doe"
    Age = 30
    Position = "Developer"
}
```

Ở đây, `$customObject` là một **`PSCustomObject`** với các thuộc tính `Name`, `Age`, và `Position`.

Chúng ta có thể truy cập nó như sau:

```powershell
$customObject.Name
$customObject.Age
$customObject.Position
```

## 4. Variables in Powershell

Trong PowerShell, biến là tên (name) hoặc nhãn (label) dùng để lưu trữ dữ liệu, và thường bắt đầu với ký hiệu `$`. Để gán giá trị cho biến, dùng toán tử `=`.

```powershell
$myVariable = "Hello World"  # Kiểu chuỗi (String)
$myNumber = 42               # Kiểu số nguyên (Integer)
$myArray = 1,2,3,4,5         # Kiểu mảng (Array)
```

Khi gán giá trị cho biến, kiểu dữ liệu của biến được xác định dựa trên cách viết giá trị sau dấu `=`. Biến `$myVariable` là chuỗi (String) vì chứa trong dấu ngoặc kép `" "`. Biến `$myNumber` là số nguyên vì viết số 42 không kèm dấu ngoặc, và `$myArray` là mảng (Array) do các giá trị được phân tách bằng dấu phẩy.

Biến trong PowerShell là **dynamic (động)**, nghĩa là kiểu dữ liệu có thể thay đổi dựa trên giá trị được gán.

### Sử dụng biến

Để gọi biến đã định nghĩa, bạn chỉ cần sử dụng tên biến (kèm ký hiệu `$`). Ví dụ, dùng cmdlet `Write-Host` để in giá trị của biến:

```powershell
Write-Host $myVariable
```

<figure><img src="/files/aLaXIXkg87AtkeL9cv4i" alt=""><figcaption></figcaption></figure>

Trong PowerShell, biến có thể lưu trữ nhiều loại dữ liệu khác nhau như chuỗi văn bản, số, Boolean, mảng, hashtable, và thậm chí cả các đối tượng tùy chỉnh, nhờ PowerShell được xây dựng trên nền tảng .NET Framework, hỗ trợ hầu hết các kiểu dữ liệu của .NET.

Trong một số trường hợp, có thể cần tạo biến với kiểu dữ liệu cụ thể. Khi đó, bạn có thể xác định kiểu khi tạo biến:

```powershell
[string]$myString = "Hello World"  # Biến kiểu chuỗi
[int]$myNumber = 42                # Biến kiểu số nguyên
[array]$myArray = 1,2,3,4,5        # Biến kiểu mảngh
```

Định nghĩa như trên giúp biến chỉ chấp nhận giá trị của một kiểu dữ liệu nhất định, và gán giá trị khác kiểu sẽ gây ra lỗi. Tính năng này giúp ngăn chặn các lỗi gán kiểu dữ liệu không phù hợp. Ví dụ, nếu chúng ta định nghĩa biến kiểu `Int` và gán giá trị kiểu `String`, PowerShell sẽ báo lỗi.

<figure><img src="/files/pHsI124KMdmYJYYGDFXd" alt=""><figcaption></figcaption></figure>

## 5. Basic operators and Expressions

PowerShell hỗ trợ nhiều toán tử khác nhau như số học, so sánh, logic và gán.

### Arithmetic Operators

<figure><img src="/files/3mjxUAl2OurQZniUaO8B" alt=""><figcaption></figcaption></figure>

Ví dụ: `$result = 5 + 2` gán tổng của 5 và 2 cho biến result.

### **Comparison Operators**

<figure><img src="/files/Z4IofMbnXY1IwwORmRd2" alt=""><figcaption></figcaption></figure>

Ví dụ: `$result = 5 -gt 2` kiểm tra xem 5 có lớn hơn 2 hay không và gán kết quả cho biến kết quả. Kết quả là một giá trị kiểu Boolean.

### Logical Operators

<figure><img src="/files/FBWYedBJ6nYGWrkOFzML" alt=""><figcaption></figcaption></figure>

Ví dụ: biểu thức `$result = (5 -gt 2) -and (2 -gt 1)` kiểm tra xem cả hai điều kiện có đúng hay không và gán kết quả cho biến result. Kết quả là một giá trị kiểu Boolean.

### **Assignment Operators**

<figure><img src="/files/wKAZBSuaUjJ4nQEKhpox" alt=""><figcaption></figcaption></figure>

Ví dụ: `$myVar = 5` gán giá trị 5 cho biến myVar. Câu lệnh `$myVar += 2` thêm 2 vào giá trị hiện tại của biến myVar.

### **Bitwise Operators**

<figure><img src="/files/XTii7jdnirkoUYWTNDVT" alt=""><figcaption></figcaption></figure>

Ví dụ: `$result = 5 -band 3`

Biểu thức này gán kết quả của phép toán AND theo bit giữa 5 và 3 cho biến `$result`.

Để hiểu rõ hơn, chúng ta hãy biểu diễn các số trong hệ nhị phân:

* Dạng nhị phân của 5: **101**
* Dạng nhị phân của 3: **011**

Toán tử AND theo bit trả về 1 khi cả hai bit tương ứng đều là 1, và trả về 0 trong các trường hợp khác. Khi thực hiện phép toán AND theo bit giữa 5 (**101**) và 3 (**011**), dạng nhị phân của kết quả sẽ là **001**, tương ứng với 1 trong hệ thập phân.

Tóm lại, biểu thức `$result = 5 -band 3` gán giá trị 1 cho biến `$result`.

### String Operators

<figure><img src="/files/oK2lY89hx3Jrw2mmM8G7" alt=""><figcaption></figcaption></figure>

Ví dụ:

```powershell
$fullName = $firstName + " " + $lastName
```

kết hợp các biến `$firstName` và `$lastName`, và gán kết quả cho biến `$fullName`.

```powershell
$name = "John"
$age = 30
$message = "Hello, my name is {0} and I am {1} years old." -f $name, $age
Write-Host $message
```

Khi bạn chạy đoạn mã này, đầu ra sẽ là:

```
Hello, my name is John and I am 30 years old.
```

Ở đây, chúng ta đã thay thế các dấu chấm lửng `{0}` và `{1}` bằng giá trị của các biến `$name` và `$age` thông qua toán tử `-f`. Đây là một cách dễ dàng để sử dụng các giá trị động trong một chuỗi.

Kiểu định dạng này thường được sử dụng để trình bày nhật ký, thông báo lỗi và thông tin cho người dùng. Nó cũng hữu ích cho các thao tác chuỗi phức tạp, đặc biệt là trong các trường hợp cần tạo chuỗi phức tạp chứa nhiều giá trị, giúp mã của bạn trở nên dễ đọc hơn.

### **Type Conversion Operators**

Các toán tử này được sử dụng để chuyển đổi loại giá trị sang loại khác.

Ví dụ: **`[int]$myString`** chuyển đổi giá trị của biến thành số nguyên.

## 6. Loop Structures

### **For Loop**

```powershell
for ($i=0; $i -lt 10; $i++) {
Write-Host $i
}
```

### ForEach Loop

Vòng lặp ForEach được sử dụng khi bạn cần thao tác trên từng phần tử của một bộ sưu tập (array, list, etc.).

```powershell
$array = 1,2,3,4,5
foreach ($item in $array) {
Write-Host $item
}
```

### **While Loop**

Vòng lặp While đảm bảo rằng vòng lặp tiếp tục miễn là một điều kiện nhất định là đúng.

```powershell
$i = 0
while ($i -lt 10) {
Write-Host $i
$i++
}
```

### **Do-While Loop**

Vòng lặp Do-while đảm bảo rằng vòng lặp xảy ra ít nhất một lần.

```powershell
$i = 0
do {
Write-Host $i
$i++
} while ($i -lt 10)
```

### **Do-Until Cycle**

Vòng lặp Do-Until giống như vòng lặp Do-While là đảm bảo rằng vòng lặp xảy ra ít nhất một lần. Sự khác biệt nằm ở chỗ là vòng lặp này tiếp tục miễn là điều kiện được chỉ định là sai.&#x20;

<figure><img src="/files/12W8x6QHGgEEJrHduk2v" alt=""><figcaption></figcaption></figure>

`$i -ge 10` - là giá trị của i phải lớn hơn hoặc bằng 10.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://viettaliii.gitbook.io/home/education/window-pe-.net/powershell/introduction-to-powershell/basics-of-powershell-commands.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
