배치 파일에서 PowerShell 스크립트를 실행하는 방법


197

PowerShell에서이 스크립트를 실행하려고합니다. 아래 스크립트를 ps.ps1데스크탑 과 같이 저장했습니다 .

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

이 PowerShell 스크립트를 실행하기위한 배치 스크립트를 만들었습니다.

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

그러나이 오류가 발생합니다.

여기에 이미지 설명을 입력하십시오

답변:


267

-ExecutionPolicy매개 변수 가 필요합니다 .

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

그렇지 않으면 PowerShell은 인수를 실행하는 라인을 고려하고있는 동안 Set-ExecutionPolicy 이다 cmdlet에, 그것은 더없는 -File매개 변수를.


2
@joey 그것은 고맙습니다 ..하지만 bat 파일을 실행 한 후 "Waring : column 'command'가 디스플레이에 맞지 않아 제거되었습니다"라는 오류가 발생했습니다
Eka

그것은 오류가 아니라 경고입니다. 그리고 또 다른 질문에 대한 더 많은 주제.
Joey

@joey이 작은 경고에 대해 stack.SE에 다른 질문을 작성하는 것이 현명합니까?
Eka

2
@Joey Haha이므로 관리자없이 효과적으로이 정책을 무시할 수 있습니다. 보안 문제입니까?
Kolob Canyon

2
@KolobCanyon : PowerShell을 실행할 수있는 위치에 있다면 다른 모든 작업도 수행 할 수 있습니다. 실행 정책이 PowerShell에 다른 권한보다 더 많은 권한이 있음을 의미하지는 않습니다. 어떤 식 으로든 실수로 달리고 싶지 않은 일을 피하는 것이 편리합니다. 현재 디렉토리에 명령을 접두사로 붙이고 ./Unix에 실행 플래그 를 갖는 것과 유사합니다 .
Joey

117

배치 파일에서 PowerShell 스크립트를 호출하려는 이유와 블로그 게시물 here에서 수행하는 방법에 대해 설명합니다 .

이것은 기본적으로 당신이 찾고있는 것입니다 :

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

PowerShell 스크립트를 관리자 권한으로 실행해야하는 경우 다음을 사용하십시오.

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

그래도 PowerShell 스크립트의 전체 경로를 하드 코딩하는 대신 내 블로그 게시물에서 설명하는 것처럼 배치 파일과 PowerShell 스크립트 파일을 동일한 디렉토리에 배치하는 것이 좋습니다.


cmd 창에 명령 줄을 입력하면 Invoke-WebRequest가 정상적으로 작동하지만 배치 파일에서 실행할 때마다 404를 반환합니다. 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}";또는 powershell -Command "Invoke-WebRequest https://www.example.com/example.ics -OutFile c:\_my\file.ics".ps1 파일에서 -File 옵션을 사용 하려고 합니다 (New-Object Net.WebClient).DownloadFile. 어떤 아이디어?
Chris

-ExecutionPolicy Unrestricted를 사용해보십시오. 우회 옵션이 PowerShell 네트워크 액세스를 제공하지 않는 것 같습니다.
deadlydog

1
@Belun 참조 된 블로그 게시물은 스크립트에 매개 변수를 전달하는 방법을 보여줍니다.
deadlydog

19

완전한 경로없이 현재 디렉토리에서 실행하려면 다음을 사용할 수 있습니다.

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

16

PowerShell을 관리자로 호출하는 배치 파일을 실행하면 다음과 같이 실행하는 것이 좋습니다.

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

사용하는 것이 좋습니다 Bypass...


3

몇 개의 스크립트를 실행하려면을 사용 Set-executionpolicy -ExecutionPolicy Unrestricted하여 재설정 할 수 있습니다 Set-executionpolicy -ExecutionPolicy Default.

실행 정책은 실행을 시작할 때만 확인되므로 백그라운드에서 작업을 실행하고 즉시 실행 정책을 재설정 할 수 있습니다.

# 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

배치에서 ps 스크립트를 실행하는 또 다른 쉬운 방법은 ECHO와 리디렉션 문자 (> 및 >>) 사이에 간단히 스크립트를 통합하는 것입니다. 예 :

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

마지막 줄은 생성 된 임시 파일을 삭제합니다.


1

PowerShell 로그인 스크립트가 2012 년 서버에서 5 분 후에 실행 된 경우 서버에 GPO 설정이 있습니다. '로그인 스크립트 지연 구성'기본 설정 '구성되지 않음'이 5 분 지연됩니다. 로그인 스크립트를 실행하기 전에


1

작은 샘플 test.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...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.