Cách chạy tập lệnh PowerShell từ tệp bó


196

Tôi đang cố gắng chạy tập lệnh này trong PowerShell. Tôi đã lưu tập lệnh dưới đây như ps.ps1trên máy tính để bàn của tôi.

$query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"
Register-WMIEvent -Query $query -Action { invoke-item "C:\Program Files\abc.exe"}

Tôi đã tạo một tập lệnh bó để chạy tập lệnh PowerShell này

@echo off
Powershell.exe set-executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1
pause

Nhưng tôi nhận được lỗi này:

Nhập mô tả hình ảnh ở đây

Câu trả lời:


266

Bạn cần -ExecutionPolicytham số:

Powershell.exe -executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1

Mặt khác, PowerShell coi các đối số là một dòng để thực thi và trong khi Set-ExecutionPolicy một lệnh ghép ngắn, nó không có -Filetham số.


2
@joey nó hoạt động được cảm ơn..nhưng sau khi chạy tập tin bat tôi đã gặp lỗi này "Waring: cột 'lệnh' không vừa với màn hình và đã bị xóa"
Eka

Đó là một cảnh báo, không phải là một lỗi. Và nhiều hơn một chủ đề cho một câu hỏi khác.
Joey

@joey có khôn ngoan không khi viết một câu hỏi khác trong stack.SE cho cảnh báo nhỏ này?
Eka

2
@Joey Haha, rất hiệu quả, bạn có thể ghi đè chính sách này mà không phải là quản trị viên. Đó có phải là một vấn đề bảo mật?
Hẻm núi Kolob

2
@KolobCanyon: Nếu bạn ở vị trí có thể chạy PowerShell, bạn cũng có thể làm mọi thứ khác. Lưu ý rằng chính sách thực thi không có nghĩa là PowerShell có nhiều đặc quyền hơn mức khác. Theo một cách nào đó, đó chỉ là sự tiện lợi để tránh vô tình chạy những thứ bạn có thể không muốn chạy. Tương tự như việc phải có các tiền tố lệnh trong thư mục hiện tại với ./và có một cờ thực thi trên Unix.
Joey

116

Tôi giải thích cả lý do tại sao bạn muốn gọi tập lệnh PowerShell từ tệp bó và cách thực hiện trong bài đăng trên blog của tôi ở đây .

Đây là những gì bạn đang tìm kiếm:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SE\Desktop\ps.ps1'"

Và nếu bạn cần chạy tập lệnh PowerShell với tư cách quản trị viên, hãy sử dụng:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Users\SE\Desktop\ps.ps1""' -Verb RunAs}"

Thay vì mã hóa toàn bộ đường dẫn đến tập lệnh PowerShell, tôi khuyên bạn nên đặt tệp bó và tệp tập lệnh PowerShell trong cùng thư mục, như bài đăng trên blog của tôi mô tả.


Invoke-WebRequest đang hoạt động tốt khi tôi nhập dòng lệnh trong cửa sổ cmd, nhưng trả về 404 bất cứ khi nào tôi chạy nó từ trong một tệp bó. Tôi đang thử PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass Invoke-WebRequest https://www.example.com/example.ics -OutFile C:\_my\script.ics' -Verb RunAs}";hoặc powershell -Command "Invoke-WebRequest https://www.example.com/example.ics -OutFile c:\_my\file.ics", hoặc sử dụng tùy chọn -File để giống nhau trong tệp .ps1 hoặc (New-Object Net.WebClient).DownloadFile. Có ý kiến ​​gì không?
Chris

Hãy thử sử dụng -ExecutPolicy Không giới hạn. Tôi đoán rằng tùy chọn Bỏ qua không cấp quyền truy cập mạng PowerShell.
deadlydog

1
@Belun Bài đăng trên blog được tham chiếu cho thấy cách truyền tham số cho tập lệnh.
deadlydog 29/2/2016

19

Nếu bạn muốn chạy từ thư mục hiện tại mà không có đường dẫn đủ điều kiện, bạn có thể sử dụng:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"

16

Nếu bạn chạy một tệp bó gọi PowerShell với tư cách quản trị viên, tốt nhất bạn nên chạy tệp như thế này, giúp bạn tránh khỏi mọi rắc rối:

powershell.exe -ExecutionPolicy Bypass -Command "Path\xxx.ps1"

Tốt hơn là sử dụng Bypass...


3

Nếu bạn muốn chạy một vài tập lệnh, bạn có thể sử dụng Set-executionpolicy -ExecutionPolicy Unrestrictedvà sau đó đặt lại với Set-executionpolicy -ExecutionPolicy Default.

Lưu ý rằng chính sách thực thi chỉ được kiểm tra khi bạn bắt đầu thực thi (có vẻ như vậy) và do đó bạn có thể chạy các công việc trong nền và đặt lại chính sách thực thi ngay lập tức.

# Check current setting
Get-ExecutionPolicy

# Disable policy
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
# Choose [Y]es

Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 example.com | tee ping__example.com.txt }
Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 google.com  | tee ping__google.com.txt  }

# Can be run immediately
Set-ExecutionPolicy -ExecutionPolicy Default
# [Y]es

2

Một cách dễ dàng khác để thực thi tập lệnh ps từ lô là chỉ cần kết hợp tập lệnh giữa ECHO và các ký tự Chuyển hướng, (> và >>), ví dụ:

@echo off
set WD=%~dp0
ECHO New-Item -Path . -Name "Test.txt" -ItemType "file" -Value "This is a text string." -Force > "%WD%PSHELLFILE.ps1"
ECHO add-content -path "./Test.txt" -value "`r`nThe End" >> "%WD%PSHELLFILE.ps1"
powershell.exe -ExecutionPolicy Bypass -File "%WD%PSHELLFILE.ps1"
del "%WD%PSHELLFILE.ps1"

Dòng cuối cùng xóa tệp tạm thời đã tạo.


1

Nếu tập lệnh đăng nhập PowerShell của bạn chạy sau 5 phút (như của tôi) trên máy chủ 2012, có cài đặt GPO trên máy chủ - 'Cấu hình tập lệnh đăng nhập Trì hoãn' cài đặt mặc định 'không được cấu hình', điều này sẽ để lại độ trễ 5 phút trước khi chạy tập lệnh đăng nhập.


1

Xét nghiệm mẫu nhỏ.cmd

<# :
  @echo off
    powershell /nologo /noprofile /command ^
         "&{[ScriptBlock]::Create((cat """%~f0""") -join [Char[]]10).Invoke(@(&{$args}%*))}"
  exit /b
#>
Write-Host Hello, $args[0] -fo Green
#You programm...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.