PowerShell Là Gì? Hướng Dẫn Chi Tiết Cho Người Mới Bắt Đầu

Microsoft PowerShell là một công cụ dòng lệnh mạnh mẽ và ngôn ngữ kịch bản, cho phép các quản trị viên hệ thống tự động hóa nhiều tác vụ trên máy tính và mạng một cách hiệu quả. Được xây dựng trên nền tảng .NET Framework, PowerShell kết hợp các tính năng của Command Prompt truyền thống với khả năng mở rộng và linh hoạt của một ngôn ngữ lập trình.

Nếu bạn đang làm việc trong lĩnh vực quản trị mạng, PowerShell là một công cụ không thể thiếu. Nó cho phép bạn quản lý các mạng lớn một cách tập trung, đơn giản hóa các công việc bảo trì hàng ngày và thực hiện các thay đổi trên toàn hệ thống một cách nhanh chóng. PowerShell đang ngày càng trở nên quan trọng trong việc quản lý môi trường đám mây lai, giúp các doanh nghiệp tối ưu hóa hiệu quả hoạt động và giảm thiểu chi phí.

Với PowerShell, bạn có thể dễ dàng lên lịch cập nhật hệ thống hàng ngày, tạo báo cáo về các tiến trình đang chạy, quản lý các dịch vụ định kỳ và thực hiện nhiều tác vụ khác. Mặc dù nhiều tác vụ trong số này có thể được thực hiện thông qua giao diện đồ họa (GUI), PowerShell cho phép bạn thực hiện chúng nhanh hơn và hiệu quả hơn, đặc biệt khi làm việc với số lượng lớn máy chủ hoặc thiết bị mạng.

Hãy tưởng tượng bạn có một nhiệm vụ bảo trì thường xuyên mất vài phút để thiết lập. Với PowerShell, bạn có thể tạo một script để tự động hóa các chức năng tương tự chỉ bằng một lệnh duy nhất. Lần sau, bạn chỉ cần mở script đó và nó sẽ chạy trong nền, giúp bạn tiết kiệm thời gian và công sức. Việc nắm vững cú pháp script của PowerShell, hiểu cách các đối tượng và biến hoạt động, và triển khai chúng một cách thông minh trên mạng của bạn sẽ giúp bạn làm việc hiệu quả hơn bao giờ hết.

Hướng dẫn này sẽ cung cấp cho bạn những kiến thức cơ bản về PowerShell, đặc biệt hữu ích cho những người mới bắt đầu trong lĩnh vực CNTT hoặc đã quen thuộc với Command Prompt của Windows. Chúng ta sẽ cùng nhau khám phá cách sử dụng các công cụ và lệnh cơ bản, cách thao tác với các tệp và thư mục, cách làm việc với các đối tượng và biến, và cách quản lý các máy chủ từ xa.

Lịch Sử Phát Triển Của PowerShell

Trước khi PowerShell ra đời, Command Prompt (cmd.exe) là trình tiện ích dòng lệnh mặc định của Windows. Mặc dù Command Prompt kế thừa một số tính năng từ DOS (COMMAND.COM), nó vẫn dựa trên các file Windows Command (.CMD và .BAT) với khả năng kịch bản còn hạn chế. Sự ra đời của Windows Scripting Host và các ngôn ngữ như VBScript và JScript đã cải thiện đáng kể khả năng kịch bản cho trình tiện ích này.

Tuy nhiên, việc thực hiện các tác vụ phức tạp vẫn còn nhiều khó khăn. Một script ở mức tổng hợp vừa phải thường đòi hỏi sự kết hợp của các lệnh batch, Windows Scripting Host và các công cụ thực thi độc lập. Mỗi công cụ này lại sử dụng các quy ước khác nhau cho quá trình thực thi, yêu cầu, phân tích cú pháp và trả về dữ liệu.

Giao diện dòng lệnh Command Prompt truyền thống, tiền thân của PowerShellGiao diện dòng lệnh Command Prompt truyền thống, tiền thân của PowerShell

Những hạn chế về hỗ trợ biến, giao diện không nhất quán và khả năng truy cập giới hạn vào các thiết lập Windows, kết hợp với việc mọi thứ đều được xử lý dưới dạng văn bản thuần túy, khiến việc triển khai và sử dụng các script dòng lệnh trở nên khó khăn. Dữ liệu đầu ra của một lệnh hoặc script phải được phân tích cú pháp và định dạng lại để có thể sử dụng làm dữ liệu đầu vào cho lệnh tiếp theo.

PowerShell ra đời để giải quyết những hạn chế này. Nó được thiết kế như một trình tiện ích dòng lệnh hướng đối tượng, cho phép các lệnh giao tiếp với nhau bằng các đối tượng thay vì chỉ là văn bản, giúp đơn giản hóa việc tự động hóa các tác vụ phức tạp.

Các Thành Phần Cơ Bản Của PowerShell

Để hiểu rõ hơn về PowerShell, chúng ta cần làm quen với ba khái niệm cơ bản: công cụ PowerShell, cmdlets và modules.

Công Cụ PowerShell

PowerShell được cài đặt mặc định trên Windows 10, Windows 7, Windows Server 2008 R2 và các phiên bản Windows mới hơn. Các phiên bản PowerShell mới thường đi kèm với nhiều tính năng mới và cmdlets, được cài đặt thông qua Windows Management Framework (WMF).

Phiên bản WMF mới nhất được khuyến nghị sử dụng là WMF 5.1. Tuy nhiên, một số tính năng mới có thể phụ thuộc vào hệ điều hành bên cạnh phiên bản WMF. Ví dụ, cmdlet Test-NetConnection, cho phép bạn kiểm tra kết nối đến một cổng TCP/IP cụ thể, chỉ khả dụng trên Windows 8 và Windows Server 2012, ngay cả khi bạn đang chạy phiên bản WMF mới nhất.

Trên hầu hết các hệ thống Windows, bạn sẽ có hai môi trường PowerShell: bảng điều khiển PowerShell và PowerShell ISE (Integrated Scripting Environment). Bảng điều khiển PowerShell có giao diện tương tự như dòng lệnh truyền thống, nhưng với đầy đủ các tính năng của PowerShell. Bạn có thể sử dụng các biến, vòng lặp, tự động hoàn thành lệnh và piping từ bảng điều khiển PowerShell.

Giao diện bảng điều khiển PowerShell với các lệnh và kết quảGiao diện bảng điều khiển PowerShell với các lệnh và kết quả

PowerShell ISE cung cấp một môi trường phát triển mạnh mẽ hơn để xây dựng và kiểm tra các script phức tạp. Nó hỗ trợ tự động hoàn thành câu lệnh, highlight code và Intellisense của Microsoft, giúp bạn viết code PowerShell dễ dàng hơn. PowerShell ISE cũng cho phép bạn làm việc với nhiều script PowerShell cùng lúc thông qua điều hướng theo tab.

Cmdlets (Lệnh Ghép Ngắn)

Cmdlets là nền tảng của các lệnh PowerShell. Microsoft đã tuân thủ một số nguyên tắc thiết kế quan trọng khi tạo ra cmdlets.

Đầu tiên, tên của cmdlet được thiết kế để dễ dàng suy luận và khám phá. Các cmdlet thường có định dạng Verb-Noun (Động từ – Danh từ), ví dụ như Get-Service, Stop-Service hoặc Import-Csv. Phần động từ cho biết hành động được thực hiện trên danh từ. Các cmdlet dùng để lấy thông tin thường bắt đầu bằng động từ Get, ví dụ như Get-Process hoặc Get-Content. Các lệnh dùng để chỉnh sửa một cái gì đó thường bắt đầu bằng động từ Set, trong khi các lệnh dùng để thêm một thực thể mới vào đâu đó thường bắt đầu bằng Add hoặc New.

Thứ hai, các tham số thường được sử dụng trong PowerShell cũng được đặt tên một cách chuẩn hóa. Ví dụ, tham số -ComputerName cho phép cmdlet được thực hiện trên một hoặc nhiều máy tính từ xa. Tham số -Credential được sử dụng để cung cấp thông tin đăng nhập của người dùng để chạy lệnh với tư cách là một người dùng cụ thể.

Modules (Mô-đun)

Module là các gói chứa các cmdlet, providers, functions, variables và aliases, được sử dụng để mở rộng chức năng của PowerShell. Các module giúp bạn tổ chức và quản lý code PowerShell của mình một cách hiệu quả.

Bạn có thể sử dụng cmdlet Get-Module để liệt kê các module hiện có trên hệ thống của bạn. Để nhập một module, bạn sử dụng cmdlet Import-Module. Sau khi một module được nhập, bạn có thể sử dụng các cmdlet và functions mà nó cung cấp.

Quản Lý Tệp Và Thư Mục Với PowerShell

Quản lý tệp và thư mục là một trong những tác vụ quan trọng nhất mà các quản trị viên hệ thống thực hiện hàng ngày. PowerShell cung cấp nhiều công cụ mạnh mẽ để tự động hóa các tác vụ này, giúp bạn tiết kiệm thời gian và công sức.

Một trong những lệnh đầu tiên mà các quản trị viên hệ thống thường học là lệnh dir (directory). Lệnh này liệt kê các tệp và thư mục có trong một thư mục cụ thể.

PowerShell có một lệnh tương tự là Get-ChildItem. Lệnh này cho phép bạn nhanh chóng tạo danh sách các tệp và thư mục trong một thư mục, và thao tác với chúng thông qua một pipeline hoặc gán đầu ra cho một biến.

Get-ChildItem có thể được sử dụng đơn giản bằng cách cung cấp một đường dẫn, thông qua pipeline, sử dụng tham số -Path hoặc ngay sau tên cmdlet. Để điều chỉnh phản hồi do Get-ChildItem trả về, bạn có thể sử dụng một số tham số như:

  • -Filter: Cho phép bạn tìm kiếm các tệp theo tên hoặc phần mở rộng.
  • -Recurse: Tìm kiếm đệ quy các thư mục con.
  • -File: Giới hạn kết quả chỉ trả về các tệp.
  • -Directory: Giới hạn kết quả chỉ trả về các thư mục.
  • -Force: Hiển thị các tệp ẩn hoặc tệp hệ thống.
  • -Hidden, -ReadOnly, -System: Chỉ trả về các tệp bị ẩn, chỉ đọc hoặc tệp hệ thống.

Kiểm tra sự tồn tại của tệp hoặc thư mục

Để kiểm tra xem một tệp có tồn tại hay không, hoặc một đường dẫn thư mục có hợp lệ hay không, bạn có thể sử dụng cmdlet Test-Path. Lệnh này trả về giá trị true hoặc false.

Test-Path thường được sử dụng như một bước phòng ngừa trước khi cố gắng sao chép hoặc xóa một tệp cụ thể.

Sao chép, di chuyển và xóa tệp

PowerShell cung cấp các cmdlet sau để thao tác với tệp và thư mục:

  • Copy-Item: Sao chép một hoặc nhiều tệp hoặc thư mục từ vị trí được chỉ định bởi tham số -Path đến vị trí được chỉ định bởi tham số -Destination.
  • Move-Item: Di chuyển tệp hoặc thư mục.
  • Remove-Item: Xóa tệp hoặc thư mục.

Khi sao chép hoặc di chuyển cấu trúc thư mục, bạn nên sử dụng tham số -Recurse để cmdlet thực hiện hành động trên thư mục và nội dung của nó. Trong một số trường hợp, bạn có thể cần sử dụng tham số -Force, chẳng hạn như khi ghi đè lên một tệp chỉ đọc.

Khi xóa tệp hoặc thư mục, bạn nên sử dụng tham số -WhatIf để xem điều gì sẽ xảy ra nếu bạn thực hiện lệnh, và tham số -Confirm để yêu cầu xác nhận của người dùng trước khi thực hiện hành động thực tế.

Sử dụng -WhatIf-Confirm

Trước khi thực hiện các thao tác xóa hàng loạt quan trọng, hãy sử dụng tham số -WhatIf. Tham số này cho phép bạn xem điều gì sẽ xảy ra nếu bạn chạy script hoặc lệnh, giúp bạn tránh được những tác động tiêu cực tiềm ẩn khi xóa dữ liệu quan trọng.

Đối với các script mà bạn định chạy thủ công, hãy sử dụng tham số -Confirm. Điều này cho phép bạn yêu cầu sự tương tác của người dùng trước khi hoạt động thực sự diễn ra.

PowerShell – Hơn Cả Các File Batch

PowerShell được viết bằng ngôn ngữ .NET và dựa trên .NET Framework. Nó được thiết kế như một trình tiện ích hướng đối tượng và ngôn ngữ kịch bản. Trong PowerShell, mọi thứ đều được xem như một đối tượng với đầy đủ các tính năng của .NET Framework. Một lệnh trả về một tập hợp các đối tượng có thể được sử dụng bằng cách sử dụng các thuộc tính và phương thức của kiểu đối tượng đó.

Khi bạn muốn chuyển dữ liệu đầu ra của một lệnh vào một lệnh khác, PowerShell thực tế sẽ chuyển đối tượng qua, không phải chỉ là dữ liệu đầu ra dạng văn bản của dòng lệnh đầu tiên. Điều này cho phép lệnh tiếp theo truy cập đầy đủ tất cả các thuộc tính và phương thức của đối tượng trong đường ống dẫn.

Việc coi tất cả mọi thứ như là một đối tượng và khả năng chuyển đối tượng giữa các lệnh là một thay đổi lớn so với các trình tiện ích dòng lệnh truyền thống. Tuy nhiên, PowerShell vẫn hoạt động giống như một trình tiện ích shell truyền thống. Bạn có thể gõ và chạy các lệnh, script và công cụ thực thi từ dòng lệnh, và kết quả sẽ được hiển thị ở dạng văn bản.

Các file Windows .CMD và .BAT, VBScripts, JScripts và các công cụ thực thi hoạt động bên trong cmd.exe, tất cả vẫn có thể chạy trong PowerShell. Tuy nhiên, vì chúng không hướng đối tượng, chúng không có quyền truy cập đầy đủ vào các đối tượng được tạo và sử dụng trong PowerShell. Các script và công cụ thực thi này vẫn sẽ coi mọi thứ dưới dạng văn bản, nhưng bạn có thể kết hợp PowerShell với một số công nghệ khác.

Ví Dụ Về Một PowerShell Script: Mô Phỏng Lệnh DIR

Để minh họa khả năng của PowerShell, chúng ta sẽ cùng nhau phát triển một script PowerShell để mô phỏng lệnh DIR trong Command Prompt.

Lệnh DIR hiển thị tất cả các tệp và thư mục con chứa trong một thư mục mẹ, cùng với thông tin về ngày giờ cập nhật mới nhất và kích thước của từng tệp. DIR cũng hiển thị kích thước tổng hợp của tất cả các tệp trong thư mục, cũng như tổng số tệp và tổng số thư mục con.

Kết quả của lệnh DIR trong Command PromptKết quả của lệnh DIR trong Command Prompt

Trong PowerShell, chúng ta có cmdlet Get-ChildItem thay thế cho lệnh DIR. Tuy nhiên, Get-ChildItem không cung cấp thông tin tóm tắt về kích thước tổng hợp của tất cả các tệp, tổng số tệp và tổng số thư mục con.

Vì vậy, chúng ta sẽ tạo một script PowerShell để mô phỏng lệnh DIR và cung cấp thông tin tóm tắt này.

DIR.PS1: Tiêu đề (Header)

Một script PowerShell bao gồm các lệnh PowerShell trong một file văn bản thuần túy với đuôi mở rộng .PS1. Thay vì DIR, chúng ta sẽ sử dụng một file text gọi là DIR.PS1.

Để chạy script, bạn gõ lệnh sau ở màn hình PowerShell:

.DIR.PS1 X:Folder

Trong đó X là ký tự phân vùng ổ (ví dụ: C, D, E) và Folder là tên thư mục.

Để lấy thông tin về phân vùng ổ, chúng ta sẽ sử dụng Windows Management Instrumentation (WMI).

$filter = "DeviceID = '" + $drive + ":'"
$volInfo = Get-WmiObject -Class Win32_LogicalDisk -Filter $filter

Đoạn mã trên tạo một biến $filter để sử dụng với lệnh Get-WmiObject. Biến lọc này cho lệnh Get-WmiObject biết rằng bạn chỉ muốn có thông tin về một ổ đĩa cụ thể. Kết quả của lệnh Get-WmiObject được lưu trữ trong một biến gọi là $volInfo.

Bây giờ bạn có thể truy cập tất cả các đối tượng và phương thức gắn với đối tượng $volInfo. Số serial của phân vùng ổ có thể truy cập qua thuộc tính VolumeSerialNumber. Thông tin trả về là một dãy số dạng xâu 8 ký tự. Chúng ta có thể định dạng nó theo kiểu bốn số tách riêng một, cách nhau bởi một dấu nối ngang:

$serial = $volInfo.VolumeSerialNumber.SubString(0, 4) + "-" + `
          $volInfo.VolumeSerialNumber.SubString(4, 4)

Bây giờ chúng ta đã có đối tượng $volInfo, chúng ta có thể in thông tin header DIR ra màn hình.

If ($volInfo.VolumeName -eq "") {
  Write-Host (" Volume in drive " + $drive + " has no label")
} Else {
  Write-Host (" Volume in drive " + $drive + " is " + $volInfo.VolumeName)
}
Write-Host (" Volume Serial Number is " + $serial)
Write-Host ("`n Directory of " + $args[0] + "`n")

DIR.PS1: Danh sách tệp/thư mục

Bây giờ, chúng ta sẽ hiển thị nội dung và đặc tính của thư mục. Đầu tiên, chúng ta gọi cmdlet Get-ChildItem để lấy tập hợp các tệp và thư mục, và đưa nó vào script như một tham số. Sau đó, chúng ta dẫn ống các đối tượng này trực tiếp vào cmdlet Sort-Object để sắp xếp chúng theo tên.

$items = Get-ChildItem $args[0] | Sort-Object

Sau khi có được tập hợp đối tượng tệp và thư mục, chúng ta lặp vòng lại chúng và hiển thị các đặc trưng phù hợp, bao gồm ngày giờ cập nhật cuối cùng, tên, chiều dài hoặc kích thước tệp.

ForEach ($i In $items) {
  $date = "{0, -20:MM/dd/yyyy hh:mm tt}" -f $i.LastWriteTime
  $file = $i.Name
  If ($i.Mode.SubString(0, 1) -eq "d") {
    $totalDirs++
    $list = $date + " {0, -15}" -f " " + " " + $file
  } Else {
    $totalFiles++
    $size = "{0, 18:N0}" -f $i.Length
    $list = $date + $size + " " + $file
  }
  $totalSize += $i.Length
  Write-Host $list
}

Hiển thị dữ liệu xuất của script được updateHiển thị dữ liệu xuất của script được update

DIR.PS1: Hậu đề (Footer)

Cuối cùng, chúng ta sẽ hiển thị tổng số tệp, thư mục, kích thước tổng cộng của tất cả các tệp và không gian trống trên phân vùng ổ.

Write-Host ("{0, 16:N0}" -f $totalFiles + " File(s)" + `
            "{0, 15:N0}" -f $totalSize + " bytes")
Write-Host ("{0, 16:N0}" -f $totalDirs + " Dir(s)" + `
            "{0, 16:N0}" -f $volInfo.FreeSpace + " bytes free`n")

Hiển thị hoàn toàn dữ liệu đầu ra của scriptHiển thị hoàn toàn dữ liệu đầu ra của script

Những điểm cần lưu ý và khả năng nâng cao

Mặc dù script mà chúng ta tạo ra cung cấp dữ liệu đầu ra gần giống hệt với lệnh DIR trong Command Prompt, nhưng có một số điểm cần lưu ý và một số nâng cao có thể thực hiện được:

  • Script này không thực hiện bất kỳ kiểm tra lỗi nào.
  • Nếu một đường dẫn hợp lệ không được đưa vào script, script sẽ báo lỗi.
  • Tổng số thư mục đưa ra trong script ít hơn 2 so với kết quả từ lệnh DIR vì cmdlet Get-ChildItem không tính hai thư mục “.” và “..”.
  • Script này chỉ sắp xếp theo tên tệp và tên thư mục, và không cung cấp thêm bất kỳ cách sắp xếp nào khác.
  • Script này không có khả năng hiển thị nội dung của các thư mục con.

Kết Luận

PowerShell là một trình tiện ích và ngôn ngữ scripting mạnh mẽ, giúp bạn tự động hóa nhiều tác vụ quản trị hệ thống một cách hiệu quả. Mặc dù có thể mất một chút thời gian để làm quen, nhưng việc nắm vững PowerShell sẽ giúp bạn tiết kiệm thời gian, nâng cao năng suất và trở thành một quản trị viên hệ thống chuyên nghiệp hơn. Hy vọng rằng bài viết này và script ví dụ sẽ hữu ích cho bất kỳ ai muốn tìm hiểu về PowerShell.