バッチファイルからPowerScriptに乗り換える際のまとめ

ALL
スポンサーリンク

バッチファイルで書いていた内容を、PowerShell で書く際はどのようになるか、その記述の違いについてです。

ファイル拡張子

バッチファイル : .bat
PowerShell : .ps1

実行方法

バッチファイル :
エクスプローラ上でバッチファイルをダブルクリック
コマンドラインから .batファイルを実行

PowerShell :
powershell -executionpolicy bypass -File test.ps1
(エクスプローラ上で .ps1 をダブルクリックしても、メモ帳でソースが開くだけです)
(コマンドラインからの実行でも同様です)

リターンコード

バッチファイル : %ERRORLEVEL%
PowerShell : $LastExitCode

コマンドライン引数

引数へのアクセスは、次のように行います。

バッチファイル :
%1~%9

PowerShell :
$args[n]
n は 0以上の数字。第一引数が n=0 , 第二引数が n=1 , … です。

パイプ・リダイレクト

パイプは、バッチファイルと同様に | で記述します。
リダイレクト の > ,>> も、バッチファイルと同様です。

出力先を NULL にする場合は次のようになります。

バッチファイル : > NUL
PowerShell : | Out-Null

変数・環境変数

PowerShell では、環境変数と変数が区別されます。

PowerShell では、環境変数は次のように扱います。

バッチファイル :
設定:SET %環境変数名%=値
参照:%環境変数名%

PowerShell :
設定:$env:環境変数名=値
参照:$env:環境変数名

変数は PowerShell では次のように扱います。
設定:$変数名=値
参照:$変数名

スポンサーリンク

CALL

別スクリプトを呼び出す場合 (バッチファイルの “CALL ファイル名” に該当する場合)

次の書式で実行します。

呼び出し側

& "c:\ps\for test\test.ps1" henoheno
※ test.ps1 が終了するまで待ちます

呼び出される側

実行されたスクリプトの最後で exit 終了コード を実行します。
呼び出し側は $LastExitCode で exitコードを取得できます。

実行例

test1.ps
& "c:\ps\for test\test.ps1" value1
Write-Host $LastExitCode
test2.ps
Start-Sleep -s 1
Write-Host $args[0]
exit 123

同一スクリプト内で関数呼び出しする場合 (バッチファイルの “CALL :ラベル” に該当する場合)

次の書式で実行します。

function 関数名(引数1,引数2,...){
        :
    return XXX;
}
関数名 引数1 引数2 スペース区切り
$r = 関数名 引数1 引数2

実行例

function func($a, $b){  
    $c = $a + $b
    return $c;
}  
$ret = func 2 3
Write-Host $ret

CD / CHDIR

PowerShell にも同じコマンドがあります

CLS

PowerShell にも同じコマンドがあります

COPY

PowerShell でも、バッチファイルとほぼ同様の動作です。
但し、デフォルトでコピー先を確認なしに上書きするかどうかが、バッチファイルとPowerShellで異なります。

バッチファイルではデフォルトでは上書き確認しますが、PowerShellでは確認無しに上書きします。

次の各組み合わせが、バッチファイルに対応するPowerShellでの実行方法です。

バッチファイル : copy A B
PowerShell : copy A B -Confirm

バッチファイル : copy A B /Y
PowerShell : copy A B

バッチファイル : copy A B /-Y
PowerShell : copy A B -Confirm

DATE

日付の表示

バッチファイル : date /T
PowerShell : date(2017年6月2日 22:29:47 のように、時間も表示されます)

DEL / ERASE

次の各組み合わせが、バッチファイルに対応するPowerShellでの実行方法です。

バッチファイル :del ファイル
PowerShell : del ファイル

バッチファイル : del a.txt /P
PowerShell : del a.txt -Confirm

バッチファイル : del a.txt /F
PowerShell : del a.txt -Force

バッチファイル : del ディレクトリ(削除の確認後、指定されたディレクトリ直下のファイルだけ削除されます)
PowerShell : del ディレクトリ(削除の確認後、指定したディレクトリが削除されます)

バッチファイル : del *.txt /S
PowerShell : Get-ChildItem -Include *.txt -Recurse | del

ECHO

バッチファイル : echo off
PowerShell : デフォルトで echo off と同じ動作です

バッチファイル : echo 文字列
PowerShell : echo “文字列”

EXIT

PowerShell にも同じコマンドがあります
呼び出し側は $LastExitCode で exitコードを取得できます

スポンサーリンク

FOR

次の各組み合わせが、バッチファイルに対応するPowerShellでの実行方法です。

バッチファイル : FOR %%変数 IN (セット) DO コマンド
PowerShell : Get-Item セット | Foreach-Object{コマンド}

バッチファイル : for %i in (*.txt) DO echo %i (%iで参照します)
PowerShell : Get-Item *.txt|Foreach-Object{echo $_} ($_で参照します)

GOTO

PowerShell には該当するものがありません。

IF

次の各組み合わせが、バッチファイルに対応するPowerShellでの実行方法です。

バッチファイル :
IF ERRORLEVEL 番号 コマンド

PowerShell :
if( $LastExitCode -ge 番号 ){
コマンド
}

バッチファイル :
IF NOT ERRORLEVEL 番号 コマンド

PowerShell :
if( -Not($LastExitCode -ge 番号) ){
コマンド
}

バッチファイル :
IF [NOT] 文字列1==文字列2 コマンド

PowerShell :
if( 文字列1 -eq 文字列2 ){
コマンド
}
if( -Not(文字列1 -eq 文字列2) ){
コマンド
}

バッチファイル :
IF [NOT] 文字列1==文字列2 コマンド

PowerShell :
if( 文字列1 -eq 文字列2 ){
コマンド
}

if( -Not(文字列1 -eq 文字列2) ){
コマンド
}

バッチファイル :
IF [NOT] EXIST ファイル名 コマンド

PowerShell :
if ( Test-Path “.\test.txt” ){
コマンド
}
if ( -Not(Test-Path “.\test.txt”) ){
コマンド
}

バッチファイル :
IF [/I] 文字列1 比較演算子 文字列2 コマンド

PowerShell :
if ( 文字列1 比較演算子 文字列2 コマンド ){
コマンド
}

比較演算子は、次のいずれかです。
/I を付ける場合は、比較演算子の頭に c を付けます(例: -ceq)

バッチ PowerShell
EQU – 等しい -eq
NEQ – 等しくない -ne
LSS – より小さい -lt
LEQ – 以下 -le
GTR – より大きい -gt
GEQ – 以上 -ge

MD / MKDIR

PowerShell にも同じコマンドがあります

MOVE

次の各組み合わせが、バッチファイルに対応するPowerShellでの実行方法です。

バッチファイル : move A B
PowerShell : move A B -Confirm

移動先が存在するファイルの場合、デフォルトではバッチファイルでは上書き確認しますが、PowerShellでは上書き確認すること無くエラーになります。
上書き確認するためには、PowerShell では -Confirmオプションが必要です

バッチファイル : move A B /Y
PowerShell : move A B -Force

バッチファイル : move A B /-Y
PowerShell : move A B -Confirm

PATH

PowerShell では、次のように扱います。
設定:$env:PATH=パス
参照:$env:PATH

PAUSE

PowerShell では、Read-Host でキー入力待ちになります。
Read-Host “続行するには何かキーを押してください . . .”
のようにすると、文字列を表示してキー入力待ちになります。

POPD

PowerShell にも同じコマンドがあります

PUSHD

PowerShell にも同じコマンドがあります

スポンサーリンク

RD / RMDIR

PowerShell にも同じコマンドがありますが、注意が必要です。
・対象ディレクトリが空では無い場合の挙動を同じにできません
・デフォルトで削除を確認するかどうかが、バッチファイルとPowerShellでは異なります。

次の各組み合わせが、バッチファイルに対応するPowerShellでの実行方法です。

バッチファイル : rd 対象ディレクトリ
PowerShell : rd 対象ディレクトリ

対象ディレクトリが空では無い場合に、注意が必要です。
バッチファイルでは「ディレクトリが空ではありません」とエラーが出るだけですが、PowerShell では、削除の確認が求められます。

バッチファイル : rd 対象ディレクトリ /S
PowerShell : rd 対象ディレクトリ -r -Confirm

バッチファイル : rd 対象ディレクトリ /S /Q
PowerShell : rd 対象ディレクトリ -r

REM

PowerShell ではコメントは # です

REN / RENAME

PowerShell にも同じコマンドがあります
リネーム先のファイルがすでに存在している場合も、バッチファイルと同様にエラーになります。

SET

環境変数を設定

バッチファイル : set 変数名=値
PowerShell : $env:変数名=値

環境変数の参照

バッチファイル : %変数名%
PowerShell : $env:変数名

環境変数を表示

バッチファイル : set
PowerShell : Get-ChildItem env:

通常の変数
PowerShell では、環境変数ではない通常の変数が使えます。
設定:$変数名=値
参照:$変数名

SHIFT

PowerShell では該当するコマンドはありません(必要ありません)
バッチでは、第1~第9までの引数は %1~%9 で扱い、10個以上は扱えませんでした。
SHIFT 実行により、%1 に 第2引数が入り、%2 に第3引数 , … , %9 に第10引数が設定されます。
このようにして、10個以上の引数を扱っていましたが、PowerShellでは 10個以上の引数を扱えるので、SHIFT に該当するコマンドはありません。

START

次の各組み合わせが、バッチファイルに対応するPowerShellでの実行方法です。

バッチファイル : START コマンド
PowerShell : Start-Process -FilePath コマンド

バッチファイル : START コマンド パラメーター
PowerShell : Start-Process -FilePath コマンド -ArgumentList パラメーター
(引数が複数ある場合は、-ArgumentList value1,value2,value3 のようにカンマ区切りで指定します)

バッチファイル : START /WAIT コマンド
PowerShell : Start-Process -FilePath コマンド -Wait

バッチファイル : copy A B /-Y
PowerShell : copy A B -Confirm

TIME

現在時刻の表示

バッチファイル : time /T
PowerShell : date(2017年6月2日 22:29:47 のように、日付も表示されます)

TYPE

PowerShell にも同じコマンドがあります

参考

PowerShell スクリプト
PowerShellでフォルダ内のファイルを一気に消す | Remember The Time
.bat(バッチファイル)のforコマンド解説。 – Qiita
Windows PowerShell の機能
PowerShellで早速つまずいたw。 ( Windows ) – コンピュータ日々勉強・・・ – Yahoo!ブログ
powershell 入門 条件 IF | 技術的なこと、あれこれ
DOS コマンド一覧 – Programming Field

コメント