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


196

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

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

ここに画像の説明を入力してください

回答:


266

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

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

そうでない場合、PowerShellは引数を実行する行と見なし、コマンドレットである間Set-ExecutionPolicy -Fileパラメーターを持ちません。


2
「:列『』コマンドの表示に合わないと削除されたワーリングは」それは私がこのエラーを得たbatファイルを実行した後thanks..but働い@joey
エカ

これは警告であり、エラーではありません。そして、別の質問の主題の詳細。
Joey

@joeyこのマイナーな警告のためにstack.SEに別の質問を書くのは賢明ですか?
2013年

2
@Joey Haha。管理者でなくても、効果的にこのポリシーを上書きできます。これはセキュリティの問題ですか?
Kolobキャニオン2016

2
@KolobCanyon:PowerShellを実行できる位置にいる場合は、他のほとんどすべてのことも実行できます。実行ポリシーは、PowerShellが他の場合よりも多くの権限を持っていることを意味するものではないことに注意してください。ある意味では、実行したくないかもしれないものを誤って実行することを避けるのは単に便利なだけです。現在のディレクトリのコマンドの前./にUnixで実行可能フラグを付ける必要があるのと同じです。
Joey

116

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


コマンドウィンドウにコマンドラインを入力すると、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 2014年

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.