Cara menjalankan skrip PowerShell dari file batch

197

Saya mencoba menjalankan skrip ini di PowerShell. Saya telah menyimpan skrip di bawah ini seperti ps.ps1pada desktop saya.

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

Saya telah membuat skrip batch untuk menjalankan skrip PowerShell ini

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

Tapi saya mendapatkan kesalahan ini:

Masukkan deskripsi gambar di sini

Eka
sumber

Jawaban:

267

Anda membutuhkan -ExecutionPolicyparameter:

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

Jika tidak PowerShell menganggap argumen baris untuk mengeksekusi dan sementara Set-ExecutionPolicy adalah cmdlet, ia tidak memiliki -Fileparameter.

Joey
sumber
2
@ joey itu bekerja terima kasih..tapi setelah menjalankan file bat saya mendapat kesalahan ini "Waring: kolom 'command' tidak cocok dengan tampilan dan dihapus"
Eka
Itu peringatan, bukan kesalahan. Dan lebih dari subjek untuk pertanyaan lain.
Joey
@ joey apakah bijaksana untuk menulis pertanyaan lain di stack.SE untuk peringatan minor ini?
Eka
2
@ Joey Haha, sangat efektif Anda dapat mengganti kebijakan ini tanpa menjadi admin. Apakah itu masalah keamanan?
Ngarai Kolob
2
@KolobCanyon: Jika Anda berada di posisi di mana Anda dapat menjalankan PowerShell, Anda dapat melakukan hampir semua hal lainnya juga. Perhatikan bahwa kebijakan eksekusi tidak berarti bahwa PowerShell memiliki lebih banyak hak istimewa daripada yang seharusnya. Di satu sisi itu hanya kenyamanan untuk menghindari menjalankan hal-hal yang Anda mungkin tidak ingin menjalankannya. Mirip dengan keharusan untuk awalan perintah di direktori saat ini dengan ./dan memiliki bendera yang dapat dieksekusi di Unix.
Joey
117

Saya menjelaskan mengapa Anda ingin memanggil skrip PowerShell dari file batch dan bagaimana melakukannya di posting blog saya di sini .

Ini pada dasarnya yang Anda cari:

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

Dan jika Anda perlu menjalankan skrip PowerShell Anda sebagai admin, gunakan ini:

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

Daripada mengkodekan seluruh path ke skrip PowerShell, saya sarankan menempatkan file batch dan file skrip PowerShell di direktori yang sama, seperti yang dijelaskan oleh posting blog saya.

deadlydog
sumber
Invoke-WebRequest bekerja dengan baik ketika saya mengetikkan baris perintah di jendela cmd, tetapi mengembalikan 404 setiap kali saya menjalankannya dari dalam file batch. Saya mencoba 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}";atau powershell -Command "Invoke-WebRequest https://www.example.com/example.ics -OutFile c:\_my\file.ics", atau menggunakan opsi-File yang sama di file .ps1, atau (New-Object Net.WebClient).DownloadFile. Ada ide?
Chris
Coba gunakan -ExecutionPolicy Tidak Terbatas. Saya menduga bahwa opsi Bypass tidak memberikan akses jaringan PowerShell.
deadlydog
1
@Belun Posting blog yang direferensikan menunjukkan cara menyampaikan parameter ke skrip.
deadlydog
19

Jika Anda ingin menjalankan dari direktori saat ini tanpa jalur yang sepenuhnya memenuhi syarat, Anda dapat menggunakan:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"
e.gad
sumber
16

Jika Anda menjalankan file batch memanggil PowerShell sebagai administrator, Anda lebih baik menjalankannya seperti ini, menghemat semua masalah Anda:

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

Lebih baik menggunakan Bypass...

Root Loop
sumber
3

Jika Anda ingin menjalankan beberapa skrip, Anda dapat menggunakan Set-executionpolicy -ExecutionPolicy Unrestricteddan kemudian mengatur ulang dengan Set-executionpolicy -ExecutionPolicy Default.

Perhatikan bahwa kebijakan eksekusi hanya diperiksa saat Anda memulai eksekusi (atau begitulah tampaknya) dan agar Anda dapat menjalankan pekerjaan di latar belakang dan segera mereset kebijakan eksekusi.

# 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
Nux
sumber
2

Cara mudah lain untuk mengeksekusi skrip ps dari batch adalah dengan menggabungkannya antara ECHO dan karakter Redirection, (> dan >>), contoh:

@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"

Baris terakhir menghapus file temp yang dibuat.

Dobbelina
sumber
1

Jika skrip login PowerShell Anda berjalan setelah 5 menit (seperti milik saya) pada server 2012, ada pengaturan GPO di server - 'Konfigurasikan skrip Login Tunda' pengaturan default 'tidak dikonfigurasi' ini akan menyebabkan penundaan 5 menit sebelum menjalankan skrip login.

Neil 11111
sumber
1

Sampel tes kecil. 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...
DimoN
sumber