PowerShell: Công cụ dòng lệnh của Microsoft khiến giới lập trình phải bất ngờ

Công nghệ22 tháng 10, 2026·6 phút đọc

Từ một công cụ bị nhiều người dùng Windows bỏ qua, PowerShell 7 đang trở thành lựa chọn đáng tin cậy cho tự động hóa và viết script nhờ khả năng đa nền tảng, hỗ trợ đối tượng gốc và hệ thống cmdlet mạnh mẽ. Bài viết phân tích vì sao PowerShell vượt trội hơn Bash trong nhiều tác vụ thực tế.

PowerShell: Công cụ dòng lệnh của Microsoft khiến giới lập trình phải bất ngờ

PowerShell: Công cụ dòng lệnh của Microsoft khiến giới lập trình phải bất ngờ

Microsoft nổi tiếng với nhiều sản phẩm phần mềm gây thất vọng, từ ứng dụng email chỉ là lớp bọc web cho đến những nút Copilot xuất hiện khắp nơi trên Windows. Chính vì vậy, thật bất ngờ khi có một sản phẩm của Microsoft thực sự cải thiện cuộc sống của người dùng — và càng bất ngờ hơn khi nó xuất phát từ chính hệ điều hành Windows.

Đó là PowerShell, công cụ dòng lệnh và viết script ra mắt năm 2006, được tích hợp sẵn từ thời Windows 7. Phiên bản hiện đại của nó đã trở thành công cụ đa nền tảng, cài được trên cả macOS và Linux.

PowerShell 7 chạy trên macOS thông qua HomebrewPowerShell 7 chạy trên macOS thông qua Homebrew

Nỗi đau mang tên Bash script

Cách phổ biến nhất để chạy một chuỗi lệnh trên Linux và macOS là viết script Bash. Với những tác vụ đơn giản, Bash hoàn toàn ổn: bạn có biến, vòng lặp, hàm và thậm chí là mảng.

Nhưng khi công việc phức tạp hơn một chút, Bash bộc lộ hàng loạt điểm yếu:

  • Gần như không có hàm tích hợp sẵn, buộc người viết phải dựa vào các lệnh POSIX hoặc công cụ bên ngoài như cURL, Wget, jq.
  • Thiếu hỗ trợ kiểu dữ liệu thực sự, khiến việc xử lý JSON hay dữ liệu có cấu trúc trở nên cồng kềnh.
  • Khó đảm bảo tính tương thích giữa các máy khác nhau, vì không thể chắc chắn máy nào có cURL, máy nào có Wget, hay thậm chí có cả lệnh sudo.
  • Phải viết nhiều mã boilerplate để phân tích tham số và tùy chọn đầu vào.

Những hạn chế này thường đẩy lập trình viên về phía các ngôn ngữ lập trình thực thụ như Python hay Node.js, ngay cả với những tác vụ không thực sự cần đến chúng.

PowerShell 7: Phiên bản bạn nên dùng

Giống nhiều sản phẩm khác của Microsoft, PowerShell tồn tại dưới hai phiên bản trùng tên. Thứ bạn nên dùng là PowerShell 7 (còn gọi là PowerShell Core), phiên bản đa nền tảng hiện đại dựa trên .NET Core. Phiên bản còn lại là Windows PowerShell (v5.1 trở xuống), dựa trên .NET Framework và không còn được phát triển tích cực.

Đáng chú ý: Windows 11 vẫn chỉ tích hợp sẵn Windows PowerShell chứ không phải PowerShell 7. Bạn cần tải miễn phí bản 7 về, hoặc cài qua Homebrew trên Mac rồi chạy bằng lệnh pwsh.

Điểm khác biệt cốt lõi nằm ở hệ thống cmdlet (đọc là "command-lets") — các lệnh tích hợp sẵn với tên dạng động từ-danh từ như Set-Location thay cho cd, Clear-Host thay cho cls, hay Remove-Item thay cho rm.

Ví dụ, một script tải video thành MP3 trong Bash:

#!/bin/bash
echo -e "Enter a URL: "
read url
cd ~/Desktop
yt-dlp -x --audio-format mp3 "$url"
echo "Done!"

Và cùng tác vụ đó trong PowerShell:

Param(
[Parameter(Mandatory = $true)][uri]$url
)
Set-Location -Path ~/Desktop
yt-dlp -x --audio-format mp3 "$url"
Write-Host "Done!"

Điểm hay nằm ở khối Param: PowerShell tự động hỏi người dùng nhập URL khi khởi chạy, đồng thời cho phép truyền tham số -url trực tiếp. Thậm chí bạn có thể dùng lệnh Get-Help trên chính script để xem danh sách tham số cùng kiểu dữ liệu của chúng — điều mà Bash phải tốn rất nhiều mã boilerplate mới làm được.

Sức mạnh từ hướng đối tượng

PowerShell hỗ trợ gốc các kiểu dữ liệu như số nguyên, chuỗi, mảng và hash table. Công cụ này còn hướng đối tượng hoàn toàn, cho phép tạo đối tượng tùy chỉnh hoặc gọi các hàm .NET khi cần.

Một trong những tính năng thú vị nhất là ổ đĩa ảo. PowerShell tạo ổ ảo cho Windows Registry, biến các khóa registry thành đường dẫn trông như đường dẫn tệp:

if (Test-Path "HKLM:\SOFTWARE\Policies\Google\Chrome") {
$IfAiSettingExists = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Google\Chrome").AIModeSettings
}

Nhờ vậy, cùng một lệnh Test-Path có thể dùng để kiểm tra sự tồn tại của một tệp trong thư mục Downloads lẫn một khóa registry. Bạn không cần học hai cách làm khác nhau cho hai loại dữ liệu, vì trong PowerShell chúng là một.

Minh họa cấu trúc script PowerShell với cmdlet và đối tượngMinh họa cấu trúc script PowerShell với cmdlet và đối tượng

Cmdlet Invoke-WebRequest hoạt động tương tự Wget hay cURL, cho phép tải nội dung web ngay trong script trên mọi nền tảng. Kết hợp với ConvertFrom-Json và ConvertTo-Json, PowerShell xử lý dữ liệu API một cách gọn gàng — điều mà với Bash thường phải nhờ đến jq.

Ứng dụng thực tế: chuyển blog Tumblr sang Eleventy

Một ví dụ điển hình là script chuyển blog Tumblr cũ sang website tĩnh dùng Eleventy. Script nhận hai đầu vào: tệp ZIP chứa bản xuất lưu trữ Tumblr và API của Tumblr.

Nó dùng Invoke-WebRequest và ConvertFrom-Json để duyệt toàn bộ bài viết, Expand-Archive để giải nén, rồi Copy-Item và New-Item để tạo cấu trúc thư mục mới. Phần quan trọng nhất là giữ nguyên siêu dữ liệu gốc — tiêu đề, permalink, ngày đăng, thẻ — bằng cách tạo đối tượng tùy chỉnh:

$PostMetadata = [PSCustomObject]@{
title = $Post.title ? $Post.title : $Post.summary
permalink = ($Post.post_url -replace $Post.blog.url, "/") + "/index.html"
date = [DateTimeOffset]::FromUnixTimeSeconds($Post.timestamp).UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ")
tags = $tag ? (@($tag) + $Post.tags) : $Post.tags
tumblr_id = $Post.id
}
$PostMetadata | ConvertTo-Json -Depth 1 | Set-Content -Path $OutputJson -Encoding UTF8

Nếu dùng Node.js cho việc này, lập trình viên sẽ phải cài thêm thư viện bên ngoài chỉ để giải nén tệp, cùng vô số câu lệnh await rải khắp nơi. PowerShell xử lý tất cả bằng công cụ có sẵn.

So sánh cấu trúc script giữa Bash và PowerShellSo sánh cấu trúc script giữa Bash và PowerShell

Vì sao PowerShell đáng để học?

Sau nhiều dự án thực tế, có thể thấy PowerShell là một bổ sung đáng giá cho bộ công cụ của bất kỳ ai làm việc với hệ thống:

  • Đa nền tảng thực sự: cùng một script chạy được trên Windows, macOS và Linux.
  • Dễ đoán và tái sử dụng hơn Bash nhờ hệ thống tham số tích hợp và kiểm tra kiểu dữ liệu.
  • Tích hợp .NET mở ra khả năng can thiệp sâu vào hệ thống khi cần.
  • Không cần cài đặt phức tạp: chỉ cần tải về hoặc cài qua trình quản lý gói.

Điều đáng tiếc là Windows 11 vẫn chưa tích hợp sẵn PowerShell 7, nên người dùng phải tự cài đặt. Nhưng với những ai thường xuyên viết script tự động hóa, đây là khoản đầu tư thời gian xứng đáng.

"Tôi vẫn đang làm quen với PowerShell, nhưng sau mỗi dự án tôi lại thấy ấn tượng hơn. Thật khó tin công cụ này lại đến từ cùng một công ty đã tạo ra Copilot."

Tất nhiên, những ai theo đuổi phong cách "lập trình thời thượng" có thể để AI như Claude lo phần suy nghĩ và kiểm thử. Nhưng với những người muốn tự tay xây dựng và duy trì kỹ năng của mình, PowerShell là lựa chọn đáng để khám phá. Có rất nhiều hướng dẫn trực tuyến, và với cộng đồng lập trình viên Việt Nam ngày càng làm việc nhiều với hệ thống Windows, đây có thể là kỹ năng hữu ích bên cạnh Bash và Python quen thuộc.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗