web-dev-qa-db-ja.com

バッチファイルからPowerShellスクリプトを実行する方法

このスクリプトを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

しかし、私はこのエラーを受けています:

Enter image description here

154
Eka

-ExecutionPolicyパラメータが必要です。

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

それ以外の場合、PowerShellは引数を実行する行と見なし、Set-ExecutionPolicy - コマンドレットですが、-Fileパラメータはありません。

210
Joey

PowerShellスクリプトをバッチファイルから呼び出す理由とその方法の両方について説明します 私のブログ投稿

これは基本的にあなたが探しているものです:

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スクリプトファイルを同じディレクトリに配置することをお勧めします。

101
deadlydog

PowerShellを管理者として呼び出すバッチファイルを実行する場合は、このように実行するほうが賢明です。

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

Bypass...を使用することをお勧めします。

13
Root Loop

完全修飾パスなしで現在のディレクトリから実行したい場合は、次のようにします。

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

いくつかのスクリプトを実行したい場合は、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
Nux

Psスクリプトをバッチから実行するもう1つの簡単な方法は、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
Dobbelina

PowerShellログインスクリプトが2012年のサーバーで5分後に実行されている場合(私の場合と同様)、サーバーにGPO設定があります。ログインスクリプトを実行する前に5分の遅延を残して下さい。

1
Neil 11111

小さなサンプル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...
0
DimoN