Jak uruchomić skrypt PowerShell z pliku wsadowego

197

Próbuję uruchomić ten skrypt w PowerShell. Zapisałem poniższy skrypt jak ps.ps1na pulpicie.

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

Zrobiłem skrypt wsadowy, aby uruchomić ten skrypt PowerShell

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

Ale pojawia się ten błąd:

Wpisz opis zdjęcia tutaj

Eka
źródło

Odpowiedzi:

267

Potrzebujesz -ExecutionPolicyparametru:

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

W przeciwnym razie PowerShell traktuje argumenty jako linię do wykonania i chociaż Set-ExecutionPolicy jest poleceniem cmdlet, nie ma -Fileparametru.

Joey
źródło
2
@joey to działało dzięki .. ale po uruchomieniu pliku nietoperza dostałem błąd „Waring: kolumna„ polecenie ”nie pasuje do wyświetlacza i została usunięta”
Eka
To ostrzeżenie, a nie błąd. I więcej tematu na kolejne pytanie.
Joey,
@joey, czy mądrze jest napisać kolejne pytanie w stosie. SE dla tego drobnego ostrzeżenia?
Eka
2
@Joey Haha, więc skutecznie możesz ominąć tę zasadę, nie będąc administratorem. Czy to problem bezpieczeństwa?
Kolob Canyon
2
@KolobCanyon: Jeśli jesteś w stanie uruchomić PowerShell, możesz zrobić prawie wszystko inne. Zauważ, że zasady wykonywania nie oznaczają, że PowerShell ma więcej uprawnień niż w innym przypadku. W pewnym sensie jest to jedynie wygoda, aby uniknąć przypadkowego uruchomienia rzeczy, których możesz nie chcieć uruchomić. Podobne do konieczności poprzedzania poleceń w bieżącym katalogu ./i posiadania flagi wykonywalnej w systemie Unix.
Joey,
117

Wyjaśniam zarówno, dlaczego chcesz wywołać skrypt PowerShell z pliku wsadowego, a jak to zrobić w moim blogu tutaj .

Właśnie tego szukasz:

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

A jeśli chcesz uruchomić skrypt PowerShell jako administrator, użyj tego:

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

Zamiast sztywno kodować całą ścieżkę do skryptu PowerShell, zalecam umieszczenie pliku wsadowego i pliku skryptu PowerShell w tym samym katalogu, jak opisano w moim blogu.

śmiertelny pies
źródło
Invoke-WebRequest działa dobrze, gdy wpisuję wiersz polecenia w oknie cmd, ale zwraca 404 za każdym razem, gdy uruchamiam go z pliku wsadowego. Próbuję 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}";lub powershell -Command "Invoke-WebRequest https://www.example.com/example.ics -OutFile c:\_my\file.ics"używam opcji -File do tego samego w pliku .ps1 lub (New-Object Net.WebClient).DownloadFile. Jakieś pomysły?
Chris
Spróbuj użyć opcji -ExecutionPolicy bez ograniczeń. Zgaduję, że opcja Bypass nie daje dostępu do sieci PowerShell.
deadlydog
1
@Belun Przywoływany post na blogu pokazuje, jak przekazać parametry do skryptu.
deadlydog
19

Jeśli chcesz uruchomić z bieżącego katalogu bez pełnej ścieżki, możesz użyć:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"
np
źródło
16

Jeśli uruchamiasz plik wsadowy wywołujący PowerShell jako administrator, lepiej uruchom go w ten sposób, oszczędzając kłopotów:

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

Lepiej jest użyć Bypass...

Root Loop
źródło
3

Jeśli chcesz uruchomić kilka skryptów, możesz użyć, Set-executionpolicy -ExecutionPolicy Unrestricteda następnie zresetować za pomocą Set-executionpolicy -ExecutionPolicy Default.

Pamiętaj, że zasady wykonywania są sprawdzane tylko po rozpoczęciu ich wykonywania (a przynajmniej tak się wydaje), dzięki czemu możesz uruchamiać zadania w tle i natychmiast resetować zasady wykonywania.

# 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
źródło
2

Innym łatwym sposobem na wykonanie skryptu ps z partii jest po prostu włączenie go między ECHO a znakami Przekierowania (> i >>), przykład:

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

Ostatni wiersz usuwa utworzony plik tymczasowy.

Dobbelina
źródło
1

Jeśli skrypt logowania do programu PowerShell działa po 5 minutach (tak jak mój) na serwerze w 2012 r., Na serwerze znajduje się ustawienie GPO - „Konfiguruj skrypt logowania Opóźnij” ustawienie domyślne „nieskonfigurowane” spowoduje pozostawienie 5-minutowego opóźnienia przed uruchomieniem skryptu logowania.

Neil 11111
źródło
1

Test małej próbki. 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
źródło