PowerShell là một công cụ mạnh mẽ dành cho quản trị hệ thống và DevOps, thường xuất hiện trong các buổi phỏng vấn IT. Để giúp bạn sẵn sàng, chúng tôi đã tổng hợp danh sách 20 câu hỏi phỏng vấn về PowerShell mới nhất 2025, bao gồm từ kiến thức cơ bản đến các tình huống thực tế. Hãy cùng tìm hiểu để nâng cao kỹ năng và tự tin hơn khi đối mặt với nhà tuyển dụng.

Đọc bài viết sau để hiểu thêm về:

  • Câu hỏi phỏng vấn Powershell cơ bản
  • Câu hỏi phỏng vấn Powershell nâng cao
  • Câu hỏi phỏng vấn tình huống về Powershell

Tổng quan về Powershell

PowerShell là một ngôn ngữ dòng lệnh (command-line shell) và ngôn ngữ scripting do Microsoft phát triển, giúp tự động hóa các tác vụ quản trị hệ thống trên Windows, Linux và macOS. PowerShell được xây dựng trên nền tảng .NET, cung cấp các cmdlet (command-let) mạnh mẽ để quản lý hệ thống, xử lý file, tương tác với API, và thực hiện các tác vụ DevOps.

PowerShell đặc biệt hữu ích cho:

  • System Administrator: Dùng để quản lý máy chủ, Active Directory, quyền truy cập và bảo mật hệ thống.
  • DevOps Engineer: Tự động hóa quy trình CI/CD, triển khai ứng dụng và quản lý hạ tầng.
  • Developer: Viết script để tự động hóa tác vụ, tương tác với API và quản lý dữ liệu.
  • Security Analysts: Kiểm tra hệ thống, thu thập log và thực hiện các tác vụ bảo mật.

Nhờ tính linh hoạt và khả năng tự động hóa mạnh mẽ, PowerShell là công cụ không thể thiếu trong môi trường IT hiện đại.

Đọc thêm: Top 30+ các lệnh trong Powershell phổ biến nhất

Câu hỏi phỏng vấn Powershell cơ bản

Powershell khác gì so với Command Prompt? Khi nào sử dụng Powershell? Khi nào sử dụng Command Prompt?

PowerShell là một command-line shell kết hợp với ngôn ngữ scripting, được Microsoft phát triển để quản lý hệ thống và tự động hóa tác vụ trên Windows, Linux và macOS. Dựa trên nền tảng .NET, PowerShell cung cấp các cmdlet mạnh mẽ, hỗ trợ quản trị hạ tầng IT, tương tác với API và triển khai DevOps hiệu quả.

Command Prompt (CMD) là một command-line interpreter trên Windows, cho phép người dùng thực thi các lệnh hệ thống cơ bản. CMD chủ yếu được sử dụng để thao tác file, chạy chương trình và thực hiện các tác vụ quản trị đơn giản nhưng không mạnh mẽ như PowerShell.

Tính năng Powershell Command Prompt (CMD)
Hỗ trợ đa nền tảng PowerShell Core (v7 trở lên) hoạt động trên Windows, Linux và macOS. CMD chỉ hoạt động trên Windows.
Hỗ trợ lệnh và tài liệu PowerShell cung cấp trợ giúp chi tiết qua Get-Help, có tài liệu phong phú và cộng đồng lớn hỗ trợ troubleshooting, hướng dẫn sử dụng. CMD chỉ cung cấp thông tin cơ bản qua Help, tài liệu hạn chế, cộng đồng nhỏ hơn.
Định dạng đầu ra Xuất dữ liệu dưới dạng đối tượng .NET, giúp xử lý linh hoạt và dễ thao tác. Xuất dữ liệu dưới dạng văn bản thuần túy, ít linh hoạt khi xử lý dữ liệu phức tạp.
Kết hợp nhiều lệnh  Hỗ trợ chaining nâng cao qua **pipeline (` `)**, giúp truyền đối tượng giữa các cmdlet.
Khả năng scripting Hỗ trợ .ps1 scripts, có vòng lặp, điều kiện, hàm, phù hợp cho tự động hóa phức tạp. Hỗ trợ batch scripts (.bat), chỉ phù hợp cho tác vụ tự động hóa đơn giản.
Xử lý dữ liệu Hỗ trợ lập trình hướng đối tượng, giúp thao tác dữ liệu có cấu trúc nhanh chóng và hiệu quả. Chỉ hỗ trợ text-based, khó làm việc với dữ liệu phức tạp.
Quản lý từ xa Hỗ trợ remote execution, giúp quản trị hệ thống từ xa hiệu quả. Hỗ trợ hạn chế, cần công cụ bên ngoài để chạy lệnh từ xa.
Giao diện người dùng Hỗ trợ tab completion, syntax highlighting, có thể tạo GUI với WPF. Giao diện cơ bản, không có tab completion hoặc syntax highlighting.
Alias lệnh  Hỗ trợ alias (gci cho Get-ChildItem), giúp thao tác nhanh hơn. Không có alias linh hoạt, cú pháp cứng nhắc.
Xử lý lỗi Có try-catch-finally, giúp debug lỗi hiệu quả. Chỉ hỗ trợ if error level, khó kiểm soát lỗi.
Tự động hóa Hỗ trợ automation mạnh mẽ, phù hợp quản trị hệ thống, DevOps. Chỉ phù hợp cho automation cơ bản như quản lý file, kiểm tra hệ thống.
Độ phức tạp Mạnh mẽ nhưng có đường cong học tập cao, phù hợp với quản trị viên hệ thống. Dễ học hơn, phù hợp cho tác vụ đơn giản.
Chẩn đoán mạng Có cmdlet nâng cao như Test-Connection, Get-NetIPAddress. Hỗ trợ tốt với ping, ipconfig, tracert, netstat.
Hiệu suất Chậm hơn CMD ở các tác vụ đơn giản do dựa trên .NET Nhanh hơn khi thực hiện các lệnh hệ thống cơ bản như copy, move, delete.

PowerShell phù hợp khi cần:

  • Quản trị hệ thống nâng cao: Quản lý Active Directory, quyền truy cập, thiết lập cấu hình hệ thống.
  • Tự động hóa quy trình: Viết script thực hiện các tác vụ lặp đi lặp lại, như kiểm tra log, backup dữ liệu.
  • Xử lý dữ liệu phức tạp: Làm việc với đối tượng .NET, JSON, XML, API.
  • Quản lý từ xa: Chạy lệnh trên nhiều máy tính qua WinRM hoặc SSH.
  • Tích hợp DevOps: Sử dụng trong CI/CD pipelines với Azure, Docker, Kubernetes.

CMD phù hợp khi cần:

  • Thực hiện tác vụ nhanh chóng: Chạy lệnh đơn giản như tạo/thay đổi thư mục, di chuyển file.
  • Kiểm tra hệ thống: Dùng ipconfig, ping, tracert, netstat để chẩn đoán mạng.
  • Tương thích với phiên bản Windows cũ: Một số hệ thống cũ chưa hỗ trợ PowerShell đầy đủ.
  • Chạy lệnh nhanh trong môi trường Windows: Khi không cần scripting phức tạp hay quản lý hệ thống từ xa.

Cmdlet là gì? Ví dụ một số Cmdlet phổ biến 

Cmdlet (Command-Let) là các lệnh nhỏ trong PowerShell, được thiết kế để thực hiện các tác vụ quản trị hệ thống một cách hiệu quả. Không giống như các lệnh trong CMD, cmdlet trong PowerShell dựa trên .NET Framework, cho phép xử lý dữ liệu dưới dạng đối tượng.

Cmdlet có cú pháp dạng:

Verb-Noun [-Parameter <Value>]

Ví dụ:

Get-Process
Set-Location
Remove-Item

Ví dụ một số Cmdlet phổ biến:

Cmdlet Chức năng
Get-Help Hiển thị hướng dẫn chi tiết về một cmdlet hoặc lệnh PowerShell.
Get-Command Liệt kê tất cả các cmdlet có sẵn trong PowerShell.
Get-Process Xem danh sách các tiến trình đang chạy trên hệ thống.
Stop-Process -Name notepad Dừng tiến trình theo tên, ví dụ dừng Notepad.
Get-Service Hiển thị danh sách các dịch vụ đang chạy trên hệ thống.
Restart-Service -Name Spooler Khởi động lại dịch vụ theo tên, ví dụ dịch vụ in ấn (Spooler).
Get-ChildItem Liệt kê file và thư mục trong một đường dẫn cụ thể.
Set-Location C:\Users Chuyển thư mục hiện tại sang C:\Users.
New-Item -ItemType File -Path “C:\test.txt” Tạo một file mới tên test.txt.
Remove-Item “C:\test.txt” Xóa file hoặc thư mục.

Pipeline trong Powershell hoạt động như thế nào? 

Pipeline (|) trong PowerShell cho phép truyền dữ liệu từ cmdlet này sang cmdlet khác mà không cần xử lý thủ công. Điểm đặc biệt của PowerShell là nó truyền đối tượng thay vì chỉ truyền văn bản như trong CMD, giúp xử lý dữ liệu hiệu quả hơn.

Mỗi cmdlet trong pipeline nhận đầu vào là một đối tượng từ cmdlet trước đó, xử lý nó, rồi truyền sang cmdlet tiếp theo.

Ví dụ:

Get-Process | Where-Object {$_.CPU -gt 10}

Trong đó: 

  • Get-Process lấy danh sách tất cả tiến trình đang chạy. 
  • Where-Object {$_.CPU -gt 10} lọc ra các tiến trình có mức sử dụng CPU lớn hơn 10%.

Ví dụ về pipeline trong Powershell:

  • Lọc danh sách dịch vụ đang chạy: 
Get-Service | Where-Object {$_.Status -eq "Running"} 

=> Hiển thị các dịch vụ đang hoạt động trên hệ thống

  • Sắp xếp tiến trình theo mức sử dụng CPU: 
Get-Process | Sort-Object CPU -Descending 

=> Liệt kê tiến trình theo thứ tự CPU giảm dần

  • Chọn thông tin cần hiển thị: 
Get-ChildItem | Select-Object Name, Length 

=> Chỉ hiển thị tên file và kích thước trong thư mục

  • Xuất danh sách tiến trình ra file: 
Get-Process | Out-File "process_list.txt" 

=> Lưu danh sách tiến trình vào file process_list.txt

  • Định dạng dữ liệu đẹp hơn: 
Get-Service | Format-Table -AutoSize 

=> Hiển thị danh sách dịch vụ theo dạng bảng gọn gàng

Làm thế nào để kiểm tra phiên bản Powershell hiện tại?

Có một số cách để kiểm tra phiên bản PowerShell, nhưng phương pháp phổ biến và nhanh nhất là sử dụng lệnh $PSVersionTable.

Kiểm tra phiên bản PowerShell bằng $PSVersionTable

Lệnh này hiển thị thông tin chi tiết về môi trường PowerShell, bao gồm số phiên bản.

Cách thực hiện:

  • Mở PowerShell trên hệ thống của bạn
  • Nhập lệnh sau và nhấn Enter: $PSVersionTable
  • Tìm dòng PSVersion trong kết quả. Đây là số phiên bản PowerShell hiện tại

Ví dụ, nếu bạn thấy dòng: PSVersion 5.1.19041.1023 Điều đó có nghĩa là bạn đang sử dụng Windows PowerShell 5.1.

Ngoài ra, $PSVersionTable còn cung cấp các thông tin khác như:

  • CLRVersion (áp dụng cho Windows PowerShell).
  • PSEdition (giúp phân biệt giữa Windows PowerShell và PowerShell Core).

Phương pháp này hoạt động trên tất cả các nền tảng có PowerShell, bao gồm Windows, Linux và macOS, giúp kiểm tra phiên bản nhanh chóng và chính xác.

Kiểm tra phiên bản PowerShell qua Registry (Windows)

Ngoài ra, trên Windows, chúng ta cũng có thể kiểm tra phiên bản PowerShell bằng cách truy cập Windows Registry. Phương pháp này đặc biệt hữu ích khi bạn không thể mở PowerShell trực tiếp hoặc cần kiểm tra phiên bản một cách tự động.

Cách thực hiện:

  • Nhấn Win + R, nhập regedit, rồi nhấn Enter để mở Registry Editor
  • Điều hướng đến đường dẫn sau: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine
  • Tìm mục PowerShellVersion. Giá trị tại đây chính là phiên bản PowerShell hiện đang cài đặt trên hệ thống

Tuy nhiên, không khuyến khích việc kiểm tra Registry Editor do yêu cầu quyền truy cập cấp cao trong hệ thống. 

Powershell Core khác gì so với Windows Powershell? 

Điểm khác biệt lớn nhất giữa PowerShell Core và Windows PowerShell nằm ở nền tảng và khả năng hỗ trợ hệ điều hành.

  • Windows PowerShell là một công cụ dòng lệnh mạnh mẽ do Microsoft phát triển, giúp tự động hóa các tác vụ quản trị hệ thống trên Windows. Nó được xây dựng dựa trên .NET Framework và hỗ trợ các cmdlet (lệnh nhỏ), scripting, cũng như quản lý hệ thống hiệu quả. Phiên bản cuối cùng của Windows PowerShell là 5.1, và Microsoft đã ngừng phát triển thêm các phiên bản mới cho nhánh này.
  • PowerShell Core là phiên bản hiện đại hơn của PowerShell, phát triển dựa trên .NET Core (sau này là .NET 5+). Không giống Windows PowerShell chỉ chạy trên Windows, PowerShell Core là đa nền tảng, hoạt động trên Windows, Linux và macOS. Từ phiên bản PowerShell Core 7.0, Microsoft đã hợp nhất thương hiệu và gọi đơn giản là PowerShell.
Tiêu chí Powershell Core Windows Powershell

(hay Powershell 5.1)

Hệ điều hành hỗ trợ Đa nền tảng (Windows, Linux, macOS) Chỉ chạy trên Windows
Phiên bản PowerShell Core 6.x, 7.x+ Windows PowerShell 5.1 trở về trước
Nền tảng Dựa trên .NET Core/.NET 5+ Dựa trên .NET Framework
Hiệu suất Nhanh hơn, tối ưu trên nhiều nền tảng Tích hợp sâu với Windows nhưng không đa nền tảng
Tương thích module Một số module cũ không hỗ trợ, nhưng có Windows Compatibility Pack Hỗ trợ đầy đủ các module Windows cũ
Lệnh gọi pwsh powershell
Phát triển & Hỗ trợ Được cập nhật thường xuyên, mã nguồn mở Ngừng phát triển, chỉ nhận cập nhật bảo mật

Nếu bạn cần làm việc trên nhiều hệ điều hành, hãy sử dụng PowerShell Core vì tính linh hoạt và hỗ trợ lâu dài. Còn nếu chỉ làm việc trên Windows và cần tích hợp sâu với hệ thống, Windows PowerShell 5.1 vẫn có thể đáp ứng nhu cầu, nhưng về lâu dài nên chuyển sang PowerShell Core để có các tính năng mới nhất.

Làm thế nào để tạo và sử dụng biến trong Powershell? 

Biến (variable) trong PowerShell là một vùng nhớ dùng để lưu trữ dữ liệu tạm thời trong quá trình thực thi tập lệnh (script) hoặc lệnh PowerShell. Biến giúp bạn dễ dàng thao tác và xử lý dữ liệu mà không cần nhập lại nhiều lần.

Trong PowerShell, biến luôn bắt đầu bằng ký tự $ và có thể chứa nhiều loại dữ liệu khác nhau như chuỗi (string), số (integer, float), mảng (array) hoặc đối tượng (object).

Cách tạo biến trong Powershell

Bạn có thể tạo biến bằng cú pháp: $TenBien = GiaTri

Ví dụ: 

$soLuong = 10

$giaTriThuc = 3.14

PowerShell sẽ tự động xác định kiểu dữ liệu của biến mà không cần khai báo trước

Cách sử dụng biến trong Powershell

  • In giá trị biến: 
$hoTen = "PowerShell"

Write-Output "Chào mừng bạn đến với $hoTen!"

Kết quả:

Chào mừng bạn đến với PowerShell!
  • Sử dụng biến trong phép toán
$a = 5

$b = 10

$tong = $a + $b

Write-Output "Tổng là: $tong"

Kết quả:

Tổng là: 15
  • Dùng biến trong vòng lặp
for ($i = 1; $i -le 5; $i++) {

    Write-Output "Giá trị: $i"

}

PowerShell có các biến hệ thống hữu ích:

  • $PSVersionTable – Kiểm tra phiên bản PowerShell
  • $null – Giá trị rỗng
  • $env:Path – Biến môi trường

Làm thế nào để lấy danh sách các lệnh có sẵn trong Powershell?

PowerShell cung cấp hàng ngàn lệnh (cmdlets) có sẵn để thực hiện các tác vụ quản trị hệ thống, xử lý tệp, quản lý tiến trình và nhiều công việc khác. Để lấy danh sách các lệnh có sẵn trong Powershell, chúng ta có thể dùng lệnh Get-command.

Lệnh Get-Command giúp liệt kê tất cả các lệnh có sẵn trong phiên PowerShell hiện tại, bao gồm:

  • Cmdlets (các lệnh gốc của PowerShell)
  • Functions (hàm do PowerShell hoặc người dùng định nghĩa)
  • Aliases (bí danh giúp viết lệnh ngắn gọn hơn)
  • Applications (chương trình thực thi trong hệ thống)

Cú pháp cơ bản:

Get-Command

Ví dụ: Liệt kê các cmdlet trong PowerShell:

Get-Command -CommandType Cmdlet

Ngoài ra, chúng ta có thể thao tác tìm kiếm lệnh phù hợp với nhu cầu như:

Lọc danh sách lệnh theo từ khóa 

Sử dụng -Name hoặc kết hợp với Where-Object để lọc theo tên

Ví dụ: Tìm tất cả lệnh có chứa từ “Process”:

Get-Command -Name *Process*

Xác định lệnh đến từ đâu

Sử dụng:

Get-Command Get-Process | Select-Object Name, Module

Để liệt kê tất cả các lệnh trong một module cụ thể (ví dụ: Microsoft.PowerShell.Management):

Get-Command -Module Microsoft.PowerShell.Management

Xem chi tiết về một lệnh cụ thể

Sau khi tìm thấy lệnh mong muốn, sử dụng Get-Help để xem chi tiết cách sử dụng:

Get-Help Get-Process -Detailed

Câu hỏi phỏng vấn Powershell nâng cao

Powershell hỗ trợ các kiểu dữ liệu nào?

Biến trong PowerShell có thể chứa nhiều loại dữ liệu khác nhau như số, chuỗi, mảng, đối tượng, và thậm chí cả kết quả từ các lệnh PowerShell.

Cụ thể về từng kiểu dữ liệu:

Loại dữ liệu Mô tả Ví dụ
Chuỗi (String) Lưu trữ văn bản, có thể sử dụng dấu ” “ hoặc ‘ ‘ $ten = “Nguyễn Văn A”
Số nguyên (Integer) Lưu trữ số nguyên (Int32, Int64) $tuoi = 30
Số thực (Float, Double, Decimal) Lưu trữ số thập phân $luong = 15000.75
Số hệ thập lục phân (Hexadecimal) Biểu diễn số theo hệ 16 $mau = 0xFF (tương đương 255)
Boolean (True/False) Lưu trữ giá trị logic đúng hoặc sai $isAdmin = $true
Mảng (Array) Lưu trữ danh sách các giá trị $dsTen = @(“Hải”, “Linh”, “Nam”)
Hash Table Lưu trữ dữ liệu theo cặp key-value $thongTin = @{HoTen=”Nguyễn Văn A”; Tuoi=30}
Đối tượng (Object) Lưu trữ dữ liệu dưới dạng đối tượng có thuộc tính $ngayGioHienTai = Get-Date
Null ($null) Đại diện cho giá trị rỗng hoặc không xác định $khongCoGi = $null
PSCustomObject Tạo đối tượng tùy chỉnh [PSCustomObject]@{Ten=”A”; Tuoi=25}
XML, JSON Hỗ trợ làm việc với dữ liệu có cấu trúc $data = ConvertTo-Json @{“Ten”=”A”}

Làm thế nào để tạo và sử dụng hàm trong Powershell?

Hàm (Function) trong PowerShell là một khối lệnh được định nghĩa để thực hiện một nhiệm vụ cụ thể. Chúng giúp tái sử dụng mã, giảm thiểu lặp code và cải thiện khả năng bảo trì. Hàm có thể nhận tham số đầu vào, thực hiện xử lý và trả về kết quả. Chúng ta có thể tạo và sử dụng hàm bằng cách sau:

Cách tạo hàm trong Powershell

Cú pháp cơ bản để định nghĩa một hàm:

function TenHam {

    param (

        [string]$thamSo1,

        [int]$thamSo2

    )

    Write-Output "Tham số 1: $thamSo1"
    Write-Output "Tham số 2: $thamSo2"

}

Gọi hàm trong PowerShell

Sau khi tạo hàm, bạn có thể gọi nó bằng cú pháp sau:

TenHam -thamSo1 "Hello" -thamSo2 123

Hoặc nếu hàm không có tham số, chỉ cần gọi tên: TenHam

Hàm có giá trị trả về

Bạn có thể sử dụng return để trả về kết quả từ hàm:

function CongHaiSo {
    param (
        [int]$a,
        [int]$b
    )
    return $a + $b
}

$ketQua = CongHaiSo -a 5 -b 10

Write-Output "Tổng hai số: $ketQua"

Hàm nâng cao với xử lý lỗi

Sử dụng Try-Catch để xử lý lỗi trong hàm:

function ChiaHaiSo {
    param (
        [int]$a,
        [int]$b
    )
    try {
        if ($b -eq 0) { throw "Không thể chia cho 0!" }
        return $a / $b
    }
    catch {
        Write-Output "Lỗi: $_"
    }
}

ChiaHaiSo -a 10 -b 0

Powershell có những kiểu xử lý lỗi gì? 

Trong PowerShell, có nhiều cách để xử lý lỗi nhằm giúp quản trị viên kiểm soát và khắc phục sự cố hiệu quả. Dưới đây là các kiểu xử lý lỗi phổ biến:

Xử lý lỗi theo mức độ nghiêm trọng (ErrorAction)

PowerShell sử dụng tham số -ErrorAction để xác định cách phản ứng khi gặp lỗi. Các giá trị phổ biến gồm:

Giá trị Mô tả
Continue (Mặc định) Hiển thị lỗi và tiếp tục thực thi lệnh tiếp theo
SilentlyContinue Bỏ qua lỗi mà không hiển thị thông báo
Stop Dừng ngay khi gặp lỗi và chuyển đến xử lý lỗi tiếp theo (nếu có)
Inquire Hỏi người dùng xem có muốn tiếp tục thực thi không
Ignore (PowerShell 7+) Bỏ qua lỗi mà không hiển thị và không lưu vào biến $Error
Suspend Dừng hoàn toàn đoạn scripts đang thực thi. Được dùng trong workflows lớn.

Ví dụ:

Get-Item "C:\ThuMucKhongTonTai" -ErrorAction SilentlyContinue

Sử dụng $Error để lưu lỗi

Biến $Error là một mảng chứa danh sách các lỗi gần đây trong PowerShell.

Ví dụ:

Write-Output "Lỗi gần nhất: $($Error[0])"

Bạn có thể sử dụng $Error.Clear() để xóa lịch sử lỗi trước đó.

Xử lý lỗi với Try-Catch-Finally

Cấu trúc Try-Catch-Finally giúp xử lý lỗi một cách rõ ràng hơn, đặc biệt hữu ích khi chạy script tự động.

Giải thích:

  • Try block: đoạn mã thực thi mà lỗi có thể xảy ra
  • Catch block: xử lý lỗi sinh ra
  • Finally block: đoạn thực thi bất kể có lỗi hay không, thường dùng để dọn dẹp.

Ví dụ:

try {
    Get-Item "C:\ThuMucKhongTonTai" -ErrorAction Stop


catch {
    Write-Output "Lỗi xảy ra: $_"


finally {
    Write-Output "Dù có lỗi hay không, khối Finally vẫn được thực thi."
}

Kiểm tra lỗi với $? và $LASTEXITCODE

  • $?: Trả về $true nếu lệnh cuối cùng chạy thành công, $false nếu thất bại.
  • $LASTEXITCODE: Dùng để kiểm tra mã lỗi khi chạy lệnh từ các chương trình bên ngoài PowerShell.

Ví dụ:

Get-Item "C:\ThuMucKhongTonTai"

Write-Output "Lệnh thành công? $?"

Cách sử dụng vòng lặp For, Foreach và While trong Powershell 

Vòng lặp là một phần quan trọng trong PowerShell giúp tự động hóa các tác vụ lặp đi lặp lại. PowerShell hỗ trợ nhiều loại vòng lặp, trong đó phổ biến nhất là For, Foreach, và While.

Vòng lặp For trong PowerShell

Vòng lặp For thường được sử dụng khi biết trước số lần lặp cụ thể.

Cú pháp vòng lặp For:

for ($i = 0; $i -lt 5; $i++) {

    Write-Output "Lần lặp thứ $i"

}

Trong đó:

  • $i = 0: Khởi tạo biến đếm.
  • $i -lt 5: Điều kiện chạy vòng lặp (chạy khi $i < 5).
  • $i++: Tăng biến đếm sau mỗi lần lặp.

Kết quả:

Lần lặp thứ 0

Lần lặp thứ 1

Lần lặp thứ 2

Lần lặp thứ 3

Lần lặp thứ 4

Vòng lặp Foreach trong PowerShell

Vòng lặp Foreach được sử dụng khi cần duyệt qua từng phần tử của một tập hợp, chẳng hạn như mảng hoặc danh sách.

Cú pháp vòng lặp Foreach:

$tenNguoi = @("An", "Bình", "Châu")

foreach ($ten in $tenNguoi) {
    Write-Output "Xin chào $ten!"
}

Trong đó:

  • Mảng $tenNguoi chứa danh sách các tên.
  • Vòng lặp duyệt qua từng phần tử và gán vào biến $ten.

Kết quả:

Xin chào An!

Xin chào Bình!

Xin chào Châu!

Vòng lặp While trong PowerShell

Vòng lặp While sẽ tiếp tục chạy miễn là điều kiện kiểm tra đúng ($true).

Cú pháp vòng lặp While:

$i = 1
while ($i -le 5) {
    Write-Output "Số: $i"
    $i++
}

Trong đó:

  • $i = 1: Khởi tạo biến đếm.
  • $i -le 5: Điều kiện kiểm tra (chạy khi $i ≤ 5).
  • $i++: Tăng giá trị biến sau mỗi lần lặp.

Kết quả:

Số: 1

Số: 2

Số: 3

Số: 4

Số: 5

Tổng hợp cách sử dụng vòng lặp

Vòng lặp Khi nào sử dụng
For Khi biết trước số lần lặp cụ thể
Foreach Khi cần lặp qua từng phần tử trong danh sách hoặc mảng
While Khi không biết trước số lần lặp, tiếp tục chạy đến khi điều kiện sai

Làm thế nào để đọc và ghi file trong Powershell?

Trong PowerShell, bạn có thể dễ dàng đọc và ghi file để xử lý dữ liệu một cách tự động. Dưới đây là các phương pháp phổ biến để thao tác với tệp tin trong PowerShell.

Cách ghi file trong PowerShell

Để ghi dữ liệu vào tệp tin, PowerShell cung cấp các cmdlet như:

  • Ghi đè nội dung file bằng Set-Content

Set-Content giúp ghi nội dung vào file và xóa nội dung cũ nếu file đã tồn tại.

Set-Content -Path "C:\example.txt" -Value "Nội dung mới của file"

Lưu ý: Nếu file đã tồn tại, nội dung cũ sẽ bị xóa và thay thế bằng nội dung mới.

  • Thêm nội dung vào file bằng Add-Content

Nếu bạn muốn thêm nội dung mới mà không làm mất dữ liệu cũ, hãy dùng Add-Content.

Add-Content -Path "C:\example.txt" -Value "Dòng mới được thêm vào!"
  • Ghi file với mã hóa UTF-8 bằng Out-File
"Đây là dòng mới" | Out-File -FilePath "C:\example.txt" -Append -Encoding utf8

Tuỳ chọn quan trọng:

  • Append: Thêm nội dung mà không ghi đè.
  • Encoding utf8: Đảm bảo file lưu đúng mã hóa UTF-8, tránh lỗi hiển thị tiếng Việt.

Cách đọc file trong PowerShell

Bạn có thể sử dụng các cmdlet dưới đây để đọc nội dung file trong PowerShell.

  • Đọc file văn bản (text file): Get-Content

Cú pháp:

Get-Content -Path <đường_dẫn_file>

Ví dụ:  

Để hiển thị toàn bộ nội dung file: 

Get-Content -Path  "C:\example.txt"

Để đọc từng dòng và xử lý nội dung file: 

foreach ($line in Get-Content "C:\example.txt") {

Write-Output "Dòng: $line"

}
  • Đọc file định dạng CSV

Cú pháp:

Import-Csv -Path "C:\duong-dan\file.csv"

Ví dụ để đọc và hiển thị dữ liệu dạng bảng: 

Import-Csv -Path "C:\data.csv" | Format-Table -AutoSize

So sánh các phương pháp đọc và ghi file trong PowerShell

Phương pháp Chức năng Ghi đè hay thêm?
Set-Content Ghi nội dung vào file Ghi đè
Add-Content Thêm nội dung vào cuối file Thêm
Out-File Xuất nội dung ra file (hỗ trợ mã hóa) Tùy chọn (-Append để thêm)
Get-Content Đọc nội dung file theo từng dòng Không áp dụng
Import-Csv Đọc file CSV và hiển thị dạng bảng Không áp dụng

Cách bật và sử dụng Set-PSDebug -Trace trong Powershell 

Set-PSDebug -Trace là một lệnh dùng để bật chế độ theo dõi (trace mode), giúp theo dõi chi tiết việc thực thi của từng lệnh trong script hoặc dòng lệnh PowerShell.

PowerShell cung cấp 3 mức độ trace:

  • Trace0: Tắt chế độ Trace (mặc định).
  • Trace1: Hiển thị từng lệnh trước khi thực thi.
  • Trace2: Hiển thị cả lệnh và kết quả trả về.

Bật Chế Độ Theo Dõi (Trace 1)

Chế độ này sẽ hiển thị lệnh trước khi thực thi.

Set-PSDebug -Trace 1

Ví dụ khi chạy đoạn script sau:

Write-Output "Hello, PowerShell"

Output:

DEBUG: 1+ >>>> Write-Output "Hello, PowerShell"

Hello, PowerShell

Bật Chế Độ Chi Tiết (Trace 2)

Chế độ này hiển thị cả lệnh thực thi và kết quả trả về, giúp theo dõi lỗi chi tiết hơn.

Set-PSDebug -Trace 2

Ví dụ chạy đoạn sau:

$x = 10

$y = $x * 2

Write-Output "Giá trị của y: $y"

Output:

DEBUG: 1+ >>>> $x = 10

DEBUG: 2+ >>>> $y = $x * 2

DEBUG: 3+ >>>> Write-Output "Giá trị của y: $y"

Giá trị của y: 20

Tắt Chế Độ Debug (Trace 0)

Sau khi kiểm tra xong, bạn có thể tắt chế độ trace bằng lệnh:

Set-PSDebug -Trace 0

Nên sử dụng Set-PSDebug -Trace khi:

  • Khi cần gỡ lỗi script PowerShell, kiểm tra lệnh nào bị lỗi.
  • Khi muốn theo dõi từng bước thực thi trong các script dài.
  • Khi cần tối ưu hóa mã lệnh bằng cách xem chi tiết cách lệnh chạy.

Một số hạn chế khi dùng Trace:

  • Có thể làm chậm script (đặc biệt là -Trace 2)
  • Đầu ra dài dòng, khó đọc
  • Chỉ nên dùng khi gỡ lỗi, sau đó nên tắt (bằng Trace0)

Sự khác biệt giữa $()@() trong Powershell 

$() trong PowerShell

Định nghĩa: $() là Toán Tử Biểu thức con (subexpression operator)

Chức năng:

  • Thực thi biểu thức con (subexpression).
  • Nhúng kết quả của một biểu thức hoặc nhiều lệnh vào một câu lệnh lớn hơn.

Cách sử dụng $():

  • Nhúng biểu thức vào chuỗi:
$name = "PowerShell"

Write-Output "Chào mừng bạn đến với $($name.ToUpper())"

Output:

Chào mừng bạn đến với POWERSHELL
  • Thực thi nhiều lệnh cùng lúc:
$result = $(Get-Date; Get-Location)

Write-Output $result

@() trong PowerShell

Chức năng:

  • Tạo một mảng (array subexpression).
  • Đảm bảo dữ liệu luôn được xử lý dưới dạng mảng, ngay cả khi kết quả là rỗng hoặc chỉ có một phần tử.

Cách sử dụng @():

  • Tạo một mảng từ nhiều giá trị:
$numbers = @(1, 2, 3, 4, 5)

Write-Output $numbers

Output: 

1

2

3

4

5
  • Đảm bảo đầu ra luôn là mảng
$singleItem = @(Get-Process -Name "explorer")

Write-Output $singleItem.Count

So sánh $() và @() trong PowerShell

Đặc điểm $() – Subexpression @() – Array Subexpression
Chức năng Thực thi biểu thức con Tạo hoặc đảm bảo giá trị luôn là mảng
Ứng dụng chính Nhúng biểu thức vào chuỗi, nhóm nhiều lệnh Định nghĩa và xử lý mảng
Trả về kết quả Kết quả đơn lẻ hoặc danh sách Luôn là mảng
Ví dụ “Tổng: $($a + $b)” $arr = @(1, 2, 3)
Khi nào nên dùng? Khi cần nhúng kết quả vào chuỗi hoặc thực thi nhiều lệnh cùng lúc Khi muốn đảm bảo dữ liệu luôn là mảng, ngay cả khi chỉ có một phần tử

Trong Powershell, array, while loop, brackets là gì?

Array

Trong PowerShell, Array (mảng) là một tập hợp chứa nhiều giá trị, giúp lưu trữ và xử lý dữ liệu một cách hiệu quả.

Cách tạo và sử dụng Array trong Powershell:

  • Khai báo một mảng:
$numbers = @(1, 2, 3, 4, 5)

Write-Output $numbers

Output:

1

2

3

4

5
  • Truy cập phần tử trong mảng:
$fruits = @("Apple", "Banana", "Cherry")

Write-Output $fruits[1]  # Trả về "Banana"
  • Thêm phần tử vào mảng:
$fruits += "Mango"

Write-Output $fruits
  • Duyệt mảng bằng vòng lặp:
foreach ($fruit in $fruits) {

    Write-Output "Trái cây: $fruit"

}

While Loop

While loop (vòng lặp while) trong PowerShell giúp thực hiện một khối lệnh miễn là điều kiện còn đúng (true).

Cú pháp While Loop trong PowerShell:

while (điều kiện) {

    # Khối lệnh thực thi

}

Ví dụ:

  • Vòng lặp while đơn giản:
$count = 1

while ($count -le 5) {

    Write-Output "Lần lặp: $count"

    $count++

}

Output:

Lần lặp: 1

Lần lặp: 2

Lần lặp: 3

Lần lặp: 4

Lần lặp: 5
  • Ứng dụng While Loop trong thực tế:
$randomNumber = Get-Random -Minimum 1 -Maximum 10
$userGuess = 0

while ($userGuess -ne $randomNumber) {
    $userGuess = Read-Host "Nhập số dự đoán"
    if ($userGuess -eq $randomNumber) {
        Write-Output "Chúc mừng! Bạn đã đoán đúng."
    } else {
        Write-Output "Sai rồi, thử lại nhé!"
    }
}

Brackets

PowerShell sử dụng nhiều loại Brackets (dấu ngoặc) để xác định cấu trúc cú pháp và logic của mã lệnh.

Loại dấu ngoặc Công dụng Ví dụ
{} – Curly Braces Xác định khối lệnh trong vòng lặp, điều kiện, hàm { Write-Output “Hello” }
() – Parentheses Nhóm biểu thức, truyền tham số vào hàm hoặc điều kiện if ($a -gt $b) { … }
[] – Square Brackets Truy cập phần tử trong mảng, định nghĩa kiểu dữ liệu $array[0], [int]$num = 10

Ví dụ:

Curly Braces {} trong vòng lặp hoặc điều kiện:

if ($true) {

    Write-Output "Điều kiện đúng"

}

Parentheses () trong điều kiện:

if ((5 + 5) -eq 10) {

    Write-Output "Kết quả đúng!"

}

Square Brackets [] để truy cập mảng:

$numbers = @(10, 20, 30)

Write-Output $numbers[1]  # Output: 20

Câu hỏi phỏng vấn tình huống về Powershell

Làm thế nào để kiểm tra và dừng một tiến trình (process) bằng Powershell?

PowerShell cung cấp nhiều cmdlet để quản lý tiến trình (process) trên hệ thống, bao gồm kiểm tra, theo dõi và dừng tiến trình đang chạy. Dưới đây là cách thực hiện các thao tác này.

Kiểm tra danh sách tiến trình đang chạy

  • Để xem danh sách các tiến trình đang chạy trên hệ thống, sử dụng lệnh:
Get-Process

Lệnh này sẽ hiển thị danh sách tất cả các tiến trình đang chạy cùng với thông tin như ID, CPU, Memory, ProcessName.

  • Nếu bạn muốn tìm kiếm một tiến trình cụ thể, có thể sử dụng tham số: -Name:
Get-Process -Name notepad

Hoặc theo Process ID (PID):

Get-Process -Id 1234

Dừng một tiến trình đang chạy

  • Để dừng một tiến trình bằng PowerShell, bạn có thể sử dụng lệnh:
Stop-Process -Name notepad -Force

Lệnh này sẽ dừng ngay lập tức tất cả các tiến trình có tên “notepad”.

  • Nếu muốn dừng theo Process ID (PID), sử dụng:
Stop-Process -Id 1234 -Force

Kiểm tra và dừng tiến trình theo điều kiện cụ thể

Nếu muốn tìm và dừng một tiến trình có mức sử dụng CPU hoặc RAM cao, bạn có thể kết hợp với Where-Object:

Get-Process | Where-Object { $_.CPU -gt 100 } | Stop-Process -Force

Lệnh này sẽ dừng tất cả các tiến trình có mức sử dụng CPU lớn hơn 100.

Xác nhận trước khi dừng tiến trình

Nếu bạn muốn nhận xác nhận trước khi dừng một tiến trình, sử dụng -Confirm:

Stop-Process -Name chrome -Confirm

Lệnh này sẽ hiển thị hộp thoại xác nhận trước khi dừng Google Chrome.

Sự khác nhau các biến $null và chuỗi rỗng (“”) trong Powershell là gì?

Trong PowerShell, $null và chuỗi rỗng (“”) đều thể hiện giá trị “trống”, nhưng chúng có những điểm khác biệt quan trọng về cách xử lý trong script. Dưới đây là sự khác biệt chi tiết giữa hai loại giá trị này.

$null

$null trong PowerShell đại diện cho không có giá trị hoặc một giá trị vô định. Nó thường được sử dụng để kiểm tra xem một biến hoặc một đối tượng có giá trị hay không.

Ví dụ:

$var = $null

if ($var -eq $null) { Write-Output "Biến không có giá trị" }

Nếu một biến được gán $null, nó không chứa bất kỳ giá trị nào, kể cả một chuỗi rỗng.

Chuỗi rỗng (“”)

Chuỗi rỗng (“” hoặc ”) trong PowerShell là một chuỗi có độ dài bằng 0, tức là một giá trị hợp lệ nhưng không chứa ký tự nào.

Ví dụ:

$var = ""

if ($var -eq "") { Write-Output "Biến chứa một chuỗi rỗng" }

Mặc dù chuỗi rỗng không có nội dung, nó vẫn là một giá trị hợp lệ khác với $null.

Tiêu chí $null Chuỗi rỗng (“”)
Bản chất Không có giá trị (vô định) Có giá trị nhưng rỗng
So sánh với $null -eq $null trả về $true -eq $null trả về $false
So sánh với “” $null -eq “” trả về $false “” -eq “” trả về $true
Khi ép kiểu sang số $null -as [int] → 0 “” -as [int] → 0
Kiểm tra độ dài $null không có thuộc tính .Length, nên không thể kiểm tra độ dài trực tiếp (sẽ gây lỗi hoặc trả về $null). “” là một chuỗi, nên có thuộc tính .Length và trả về 0.
Ảnh hưởng khi nối chuỗi “Hello ” + $null → “Hello “ “Hello ” + “” → “Hello “

Chú ý:

  • Dùng $null khi cần kiểm tra sự tồn tại của biến hoặc giá trị chưa được khởi tạo.
  • Dùng chuỗi rỗng (“”) khi cần lưu trữ một chuỗi nhưng không có nội dung, chẳng hạn như nhập liệu trống từ người dùng.

Sự khác nhau giữa Phiên bản PowerShell 5.1 và Powershell 7 là gì?

  • PowerShell 5.1: Là phiên bản cuối cùng của Windows PowerShell, được cài đặt sẵn trên Windows 10 và Windows Server. Phiên bản này dựa trên .NET Framework, do đó chỉ chạy trên Windows.
  • PowerShell 7: Là phiên bản mới nhất của PowerShell Core, được phát triển dựa trên .NET Core (hiện tại là .NET 6/7). Phiên bản này hỗ trợ đa nền tảng (Windows, Linux, macOS) và có nhiều tính năng cải tiến so với 5.1.
Tiêu chí Powershell 5.1 Powershell 7
Nền tảng Chạy trên Windows (dựa trên .NET Framework) Chạy trên Windows, Linux, macOS (dựa trên .NET Core/.NET 6)
Hiệu suất Chạy ổn định nhưng không tối ưu hiệu suất Tốc độ cao hơn, tối ưu xử lý song song
Khả năng tương thích Tương thích tốt với Windows và các mô-đun cũ Hỗ trợ mô-đun Windows thông qua WindowsCompatibility
Lệnh (Cmdlets) Hỗ trợ nhiều cmdlets truyền thống của Windows Bổ sung thêm nhiều cmdlets và cải tiến cú pháp
Xử lý lỗi Hạn chế trong việc xử lý lỗi Có nhiều tính năng sửa lỗi tốt hơn
Hỗ trợ cập nhật Chỉ nhận bản vá lỗi, không có tính năng mới Được phát triển liên tục, cập nhật tính năng mới
Cộng đồng & Hỗ trợ Chủ yếu do Microsoft duy trì, ít cập nhật Open-source, nhận được nhiều đóng góp từ cộng đồng

Những tính năng mới trong Powershell 7 so với Powershell 5.1

  • Hỗ trợ đa nền tảng: PowerShell 7 có thể chạy trên Windows, Linux, macOS, trong khi PowerShell 5.1 chỉ hoạt động trên Windows. Điều này giúp PowerShell 7 phù hợp hơn với các môi trường DevOps và Cloud.
  • Cải thiện hiệu suất: Nhờ sử dụng .NET Core/.NET 6, PowerShell 7 có tốc độ thực thi nhanh hơn và tiêu thụ ít tài nguyên hơn so với PowerShell 5.1.
  • Hỗ trợ lỗi trong pipeline: PowerShell 7 giới thiệu cú pháp Try { } Catch { } nâng cao, giúp xử lý lỗi ngay trong pipeline mà không làm dừng toàn bộ lệnh.
  • Hỗ trợ mô-đun Windows trong PowerShell 7: Mặc dù PowerShell 7 không hỗ trợ đầy đủ tất cả các cmdlets Windows cũ, nhưng có thể chạy chúng bằng mô-đun WindowsCompatibility

Vậy:

  • Sử dụng PowerShell 5.1 nếu bạn làm việc trên Windows Server cũ hoặc cần các mô-đun Windows truyền thống.
  • Chọn PowerShell 7 nếu cần đa nền tảng, hiệu suất cao hơn và tích hợp tốt với DevOps, CI/CD.

Cách quản lý tài khoản người dùng và nhóm trong Active Directory bằng Powershell là gì?

PowerShell cung cấp các cmdlet mạnh mẽ để quản lý Active Directory (AD), giúp tự động hóa việc tạo, sửa, xóa tài khoản người dùng, nhóm và các thao tác liên quan.

Để thực hiện các lệnh này, cần cài đặt Active Directory Module for Windows PowerShell và có quyền quản trị trên AD. Sau đó chúng ta có thể làm các thao tác sau:

Kiểm tra module Active Directory đã được cài đặt hay chưa

Trước khi quản lý AD bằng PowerShell, bạn cần kiểm tra xem module đã có trên hệ thống hay chưa:

Get-Module -ListAvailable ActiveDirectory 

Nếu module chưa được cài đặt, bạn có thể cài bằng lệnh:

Import-Module ActiveDirectory

Tạo tài khoản người dùng trong Active Directory

Bạn có thể sử dụng New-ADUser để tạo tài khoản người dùng mới trong AD:

New-ADUser -Name "Nguyen Van A" -GivenName "Nguyen" -Surname "A" -SamAccountName "nva" `

-UserPrincipalName "nva@example.com" -Path "OU=Users,DC=example,DC=com" -AccountPassword (ConvertTo-SecureString "Password123!" -AsPlainText -Force) -Enabled $true

Lệnh này tạo một tài khoản với mật khẩu đặt trước và kích hoạt tài khoản ngay lập tức.

Cập nhật thông tin người dùng trong Active Directory

Nếu muốn thay đổi thông tin tài khoản AD, bạn có thể dùng Set-ADUser:

Set-ADUser -Identity "nva" -Title "IT Manager" -Department "IT" -OfficePhone "0123456789"

Lệnh này cập nhật chức danh, bộ phận và số điện thoại cho người dùng.

X¢óa tài khoản người dùng trong Active Directory

Để xóa tài khoản người dùng AD, sử dụng Remove-ADUser:

Remove-ADUser -Identity "nva" -Confirm:$false

Lệnh này sẽ xóa ngay lập tức tài khoản mà không cần xác nhận.

Tạo nhóm trong Active Directory

Dùng New-ADGroup để tạo nhóm AD mới:

New-ADGroup -Name "IT Team" -GroupScope Global -GroupCategory Security -Path "OU=Groups,DC=example,DC=com"

Lệnh này tạo một nhóm bảo mật cấp Global trong Organizational Unit (OU) “Groups”.

Thêm người dùng vào nhóm trong Active Directory

Dùng Add-ADGroupMember để thêm người dùng vào nhóm AD:

Add-ADGroupMember -Identity "IT Team" -Members "nva"

Lệnh này thêm tài khoản “Nguyen Van A” vào nhóm IT Team.

Xóa người dùng khỏi nhóm trong Active Directory

Nếu muốn xóa người dùng khỏi nhóm, sử dụng Remove-ADGroupMember:

Remove-ADGroupMember -Identity "IT Team" -Members "nva" -Confirm:$false

Lệnh này sẽ xóa ngay lập tức người dùng khỏi nhóm mà không yêu cầu xác nhận.

Xóa nhóm trong Active Directory

Sử dụng Remove-ADGroup để xóa một nhóm:

Remove-ADGroup -Identity "IT Team" -Confirm:$false

Lệnh này sẽ xóa nhóm IT Team khỏi AD.

Làm thế nào để gọi API RESTful bằng Powershell?

PowerShell cung cấp các cmdlet mạnh mẽ để gọi API RESTful, cho phép truy xuất dữ liệu từ web services hoặc thực hiện các tác vụ tự động hóa trên nền tảng đám mây. Các cmdlet phổ biến nhất để thực hiện điều này là Invoke-RestMethodInvoke-WebRequest:

  • Invoke-RestMethod có hiệu suất nhanh hơn, chỉ trả về dữ liệu đã phân tích, dễ làm việc với API hơn. 
  • Invoke-WebRequest phức tạp hơn, chậm hơn nhưng trả về nội dung thô, có thể phận tích HTML, kiểm tra header.

Cách gọi API RESTful bằng Powershell như sau:

Gửi yêu cầu GET để lấy dữ liệu từ API

Lệnh Invoke-RestMethod thường được sử dụng để gửi yêu cầu GET đến một API và nhận dữ liệu ở định dạng JSON hoặc XML: 

$response = Invoke-RestMethod -Uri "https://api.example.com/data" -Method Get

$response

Lệnh này sẽ lấy dữ liệu từ API https://api.example.com/data và lưu vào biến $response để tiếp tục xử lý.

Gửi yêu cầu POST với dữ liệu đầu vào

Để gửi yêu cầu POST, người dùng cần cung cấp dữ liệu trong phần -Body và chỉ định kiểu nội dung bằng -ContentType

$body = @{ username = "admin"; password = "123456" } | ConvertTo-Json

$response = Invoke-RestMethod -Uri "https://api.example.com/login" -Method Post -Body $body -ContentType "application/json"

$response

Lệnh này gửi thông tin đăng nhập dưới dạng JSON và nhận phản hồi từ API.

Gửi yêu cầu với tiêu đề xác thực (Authorization Header)

Khi gọi API yêu cầu xác thực, có thể thêm header Authorization bằng cách sử dụng -Headers:

$headers = @{ Authorization = "Bearer your_access_token" }

$response = Invoke-RestMethod -Uri "https://api.example.com/userinfo" -Method Get -Headers $headers

$response

Điều này giúp xác thực người dùng trước khi truy xuất dữ liệu từ API.

Gửi yêu cầu PUT và DELETE

PowerShell cũng hỗ trợ các phương thức HTTP khác như PUT (cập nhật dữ liệu) và DELETE (xóa dữ liệu):

# Cập nhật dữ liệu bằng phương thức PUT
$updateData = @{ name = "New Name" } | ConvertTo-Json
Invoke-RestMethod -Uri "https://api.example.com/user/123" -Method Put -Body $updateData -ContentType "application/json"

# Xóa dữ liệu bằng phương thức DELETE
Invoke-RestMethod -Uri "https://api.example.com/user/123" -Method Delete

Những phương thức này rất hữu ích khi làm việc với API CRUD (Create, Read, Update, Delete).

Xử lý lỗi khi gọi API

Để xử lý lỗi khi gọi API, có thể sử dụng Try-Catch:

try {
    $response = Invoke-RestMethod -Uri "https://api.example.com/data" -Method Get
} catch {
    Write-Host "Lỗi khi gọi API: $_"
}

Điều này giúp tránh gián đoạn chương trình khi gặp lỗi kết nối hoặc API không phản hồi.

Cách sử dụng Powershell Remoting để quản lý máy chủ từ xa thế nào?

PowerShell Remoting là một tính năng mạnh mẽ giúp quản trị viên hệ thống thực thi lệnh và quản lý máy chủ từ xa một cách an toàn. Tính năng này hoạt động dựa trên giao thức WS-Management (WinRM) và cho phép kết nối với nhiều máy tính trong mạng nội bộ hoặc trên đám mây.

Để bật PowerShell Remoting, người dùng cần chạy lệnh sau trên máy chủ mục tiêu: 

Enable-PSRemoting -Force

=> Lệnh này kích hoạt dịch vụ WinRM và cấu hình các cài đặt firewall cần thiết để cho phép kết nối từ xa.

Khi PowerShell Remoting đã được bật, quản trị viên có thể kết nối với máy chủ từ xa bằng lệnh:

Enter-PSSession: Enter-PSSession -ComputerName Server01 -Credential Administrator 

=> Lệnh này mở một phiên làm việc từ xa với máy chủ Server01, cho phép người dùng chạy các lệnh như thể họ đang làm việc trực tiếp trên máy đó. Ngoài ra, ta có thể kiểm tra máy từ xa có hỗ trợ WinRM không bằng cmdlet TestWSMan:

TestWSMan -ComputerName "remote-computer-name"

Ta có thể kiểm tra máy từ xa có hỗ trợ WinRM không bằng cmdlet TestWSMan:

TestWSMan -ComputerName "remote-computer-name"

Để chạy lệnh trên nhiều máy chủ cùng lúc, có thể sử dụng 

Invoke-Command:

Invoke-Command -ComputerName Server01, Server02 -ScriptBlock { Get-Service } -Credential Administrator 

=> Lệnh này thực thi đoạn mã { Get-Service } trên cả hai máy chủ Server01 Server02, giúp kiểm tra trạng thái các dịch vụ trên hệ thống từ xa.

PowerShell Remoting còn hỗ trợ chạy script tự động trên nhiều máy chủ, giúp tự động hóa các tác vụ như cập nhật phần mềm, kiểm tra trạng thái hệ thống hoặc triển khai cấu hình. Bằng cách kết hợp với New-PSSession, người dùng có thể thiết lập nhiều phiên làm việc cùng lúc và quản lý hệ thống một cách hiệu quả.

Khi một script PowerShell chạy rất chậm thì nên làm gì?

Khi một script PowerShell chạy chậm, cần thực hiện nhiều bước tối ưu hóa để cải thiện hiệu suất. Dưới đây là một số phương pháp quan trọng:

Xác định nguyên nhân gây chậm bằng công cụ đo thời gian

Trước khi tối ưu, cần xác định đoạn mã nào gây chậm bằng cách sử dụng Measure-Command:

Measure-Command { <Lệnh cần đo thời gian thực thi> } 

Điều này giúp xác định đoạn mã nào đang tiêu tốn nhiều thời gian nhất.

Sử dụng Pipeline hiệu quả

Hạn chế sử dụng vòng lặp thay vì pipeline vì pipeline xử lý dữ liệu nhanh hơn. 

Ví dụ, thay vì:

$users = Get-ADUser -Filter *  

$users | ForEach-Object { $_.SamAccountName }

Hãy sử dụng trực tiếp pipeline:

Get-ADUser -Filter * | Select-Object -ExpandProperty SamAccountName

Cách này giúp giảm đáng kể thời gian xử lý. Pipeline nhanh hơn khi cần xử lý dữ liệu theo luồng (streaming), còn với dữ liệu đã có sẵn, dùng foreach sẽ nhanh hơn.

Tránh sử dụng ForEach-Object nếu có thể

ForEach-Object chậm hơn vòng lặp foreach thông thường. Nếu có thể, hãy thay bằng:

foreach ($user in $users) {

    Write-Output $user.SamAccountName

}

Điều này giúp cải thiện tốc độ xử lý khi thao tác với số lượng lớn dữ liệu.

Hạn chế truy vấn lặp lại

Nếu cần gọi một lệnh nhiều lần, hãy lưu trữ kết quả thay vì gọi lại nhiều lần:

$users = Get-ADUser -Filter *  

foreach ($user in $users) {

    Write-Output $user.SamAccountName

}

Thay vì gọi Get-ADUser nhiều lần trong vòng lặp.

Chạy script ở chế độ đa luồng (Parallel Processing)

PowerShell 7 hỗ trợ xử lý song song với -Parallel trong ForEach-Object: 

$users | ForEach-Object 

-Parallel { $_.SamAccountName } 

Điều này giúp tận dụng CPU đa nhân và tăng tốc độ xử lý. 

* Lưu ý: Chỉ nên dùng -Parallel cho các tác vụ nặng (như xử lý file, gọi API) để tránh phụ thuộc vào tài nguyên chung.

Giảm tải log và output không cần thiết

Lệnh Write-Host hoặc Write-Output quá nhiều sẽ làm chậm script. Chỉ hiển thị thông tin khi cần thiết.

Sử dụng Jobs để xử lý nền

Nếu script chạy tác vụ lâu, hãy chạy dưới dạng Background Job:

Start-Job -ScriptBlock { Get-Process }

Điều này giúp không làm chậm quá trình tương tác chính.

Để tối ưu script PowerShell chạy chậm, bạn nên đo hiệu suất, sử dụng pipeline hiệu quả, tránh truy vấn lặp lại, tối ưu vòng lặp, áp dụng đa luồng và giảm log không cần thiết. Những kỹ thuật này sẽ giúp tăng tốc đáng kể quá trình thực thi PowerShell script.

Tổng kết câu hỏi phỏng vấn Powershell

Trên đây là tổng hợp 20+ câu hỏi phỏng vấn Powershell mới nhất 2025. Hy vọng, đây sẽ là một nguồn tham khảo đáng tin cậy và giúp ích cho bạn chuẩn bị cho cuộc phỏng vấn sắp tới. Chúc bạn may mắn.