Sửa lỗi PowerShell "is not recognized as the name of a cmdlet, function, script file, or operable program"

beginner🪟 Windows2026-05-21| Windows 10/11, PowerShell 5.1, PowerShell 7+

Error Message

is not recognized as the name of a cmdlet, function, script file, or operable program
#windows#powershell#path#cmdlet

Chuyện gì đang xảy ra

Bạn chạy một lệnh và PowerShell trả về lỗi này:

foo : The term 'foo' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

Nghĩa là: PowerShell đã tìm khắp mọi thư mục nó biết nhưng không thấy gì. Cách sửa phụ thuộc vào lý do nó không tìm thấy lệnh — thiếu đường dẫn PATH, module chưa được tải, sai shell, hoặc execution policy đang chặn script.

Chẩn đoán trước khi sửa

1. Kiểm tra xem lệnh có tồn tại không

Bắt đầu với Get-Command:

Get-Command foo

Không có kết quả nghĩa là PowerShell thực sự không biết về lệnh đó. Nếu có đường dẫn trong kết quả thì file nhị phân tồn tại nhưng có vấn đề khác — quyền truy cập, cài đặt bị hỏng, hoặc sai phiên bản.

2. Kiểm tra nội dung PATH của bạn

$env:PATH -split ';'

Duyệt danh sách để tìm thư mục chứa công cụ của bạn. Không có trong danh sách? Đó gần như chắc chắn là nguyên nhân.

3. Xác nhận vị trí thực của file nhị phân

# Ví dụ cho một công cụ CLI cài vào đường dẫn tùy chỉnh
Test-Path "C:\Tools\mytool\mytool.exe"

True nghĩa là file tồn tại — chỉ là chưa được thêm vào PATH.

Cách sửa 1: Thêm thư mục còn thiếu vào PATH

Chín phần mười trường hợp, đây là thủ phạm. Thêm thư mục vĩnh viễn cho tài khoản người dùng của bạn:

# Thêm vào PATH của user — tồn tại sau khi khởi động lại
$dir = "C:\Tools\mytool"
$current = [Environment]::GetEnvironmentVariable("PATH", "User")
if ($current -notlike "*$dir*") {
    [Environment]::SetEnvironmentVariable("PATH", "$current;$dir", "User")
    Write-Host "Added $dir to PATH"
} else {
    Write-Host "Already in PATH"
}

Đóng và mở lại PowerShell sau khi chạy lệnh này. Phiên hiện tại sẽ không nhận thay đổi.

Cần dùng ngay mà không muốn khởi động lại? Dùng lệnh một dòng này — chỉ có tác dụng trong phiên hiện tại:

$env:PATH += ";C:\Tools\mytool"

Kiểm tra lại sau khi sửa

Get-Command mytool
mytool --version

Cách sửa 2: Execution policy đang chặn script .ps1

Chạy script .ps1 chỉ bằng tên mà không có tiền tố đường dẫn sẽ gây ra lỗi này. Chính sách Restricted cũng vậy — nó chặn tất cả script theo mặc định.

# Kiểm tra chính sách hiện tại
Get-ExecutionPolicy

# Cho phép script được viết cục bộ (an toàn cho máy dev)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

PowerShell không tìm kiếm script trong thư mục hiện tại như cmd.exe. Luôn gọi script cục bộ với đường dẫn rõ ràng:

# Sai — PowerShell bỏ qua thư mục hiện tại khi tìm script
myscript

# Đúng
.\myscript.ps1
# hoặc đường dẫn đầy đủ
"C:\Scripts\myscript.ps1"

Cách sửa 3: Module chưa được import

Nhiều cmdlet được đóng gói trong các module không được tải mặc định. Connect-AzAccount, Get-AzVM, và hầu hết các cmdlet của nhà cung cấp đều thuộc nhóm này.

# Xem các module đang được tải
Get-Module

# Tìm module có sẵn khớp với cmdlet của bạn
Get-Module -ListAvailable | Where-Object { $_.Name -like "*Az*" }

# Tải module
Import-Module Az.Accounts

Nếu module chưa được cài, hãy lấy từ PowerShell Gallery trước:

Install-Module -Name Az -Scope CurrentUser -Force

Sau đó chạy lại lệnh ban đầu của bạn.

Cách sửa 4: Bạn đang dùng sai shell

cmd.exe và PowerShell không thể dùng thay thế cho nhau. Kiểm tra nhanh:

# Chạy lệnh này — nếu ra số phiên bản nghĩa là bạn đang ở PowerShell
$PSVersionTable.PSVersion

# Lỗi? Bạn đang ở cmd.exe. Khởi động PowerShell:
powershell
# Hoặc dùng PowerShell 7:
pwsh

Một điểm cần lưu ý: Windows PowerShell 5.1 và PowerShell 7 là hai bản cài riêng biệt với thư mục module riêng. Module cài trong 5.1 sẽ không xuất hiện trong 7 và ngược lại. Bạn cần cài lại cho phiên bản kia.

Cách sửa 5: Gõ sai hoặc nhầm tên lệnh

Cmdlet trong PowerShell tuân theo quy tắc nghiêm ngặt Verb-Noun. Nếu không chắc tên chính xác, hãy tìm kiếm:

# Tìm kiếm theo tên một phần
Get-Command *process*
Get-Command -Verb Get -Noun *service*

# Hoặc chỉ cần nhấn Tab sau khi gõ vài chữ đầu

Cách sửa 6: Lệnh được cài cho user hoặc phạm vi khác

Các trình cài đặt theo từng user — npm global packages, pip, Scoop và các công cụ khác — đặt file nhị phân vào thư mục riêng của user, thường không có trong system PATH.

# npm: tìm thư mục bin global
npm config get prefix
# Kết quả thường là: C:\Users\you\AppData\Roaming\npm
# Thư mục đó cần có trong PATH

# pip: tìm thư mục scripts của user
python -m site --user-scripts

Sao chép đường dẫn từ kết quả và thêm vào PATH theo cách hướng dẫn ở Cách sửa 1.

Danh sách kiểm tra xác nhận

  • Chạy Get-Command <toolname> — phải trả về kết quả với đường dẫn hợp lệ
  • Chạy trực tiếp lệnh đó — không còn lỗi "not recognized"
  • Mở một cửa sổ PowerShell mới và chạy lại — điều này xác nhận thay đổi PATH là vĩnh viễn, không chỉ ở cấp độ phiên
  • Nếu là vấn đề module, Get-Module bây giờ phải liệt kê module đã được import

Bài học rút ra

  • PowerShell không tìm kiếm thư mục hiện tại để tìm file thực thi (khác với cmd.exe). Script cục bộ cần có tiền tố .\script.ps1 rõ ràng.
  • Thay đổi PATH qua System Properties hoặc [Environment]::SetEnvironmentVariable yêu cầu mở shell mới. Cách dùng $env:PATH trong phiên chỉ là tạm thời.
  • PowerShell 5.1 và PowerShell 7 có kho module riêng biệt. Chuyển đổi giữa hai phiên bản đồng nghĩa với việc phải cài lại module ở phiên bản kia.
  • Khi trình cài đặt thông báo đã "thêm vào PATH", hãy tự kiểm tra bằng $env:PATH -split ';'. Một số trình cài đặt thất bại im lặng, số khác cần đăng xuất hoàn toàn mới áp dụng được thay đổi trên toàn hệ thống.

Related Error Notes