バッチファイルで書いていた内容を、PowerShell で書く際はどのようになるか、その記述の違いについてです。
ファイル拡張子
バッチファイル : .bat
PowerShell : .ps1
実行方法
バッチファイル :
エクスプローラ上でバッチファイルをダブルクリック
コマンドラインから .batファイルを実行PowerShell :
powershell -executionpolicy bypass -File test.ps1
(エクスプローラ上で .ps1 をダブルクリックしても、メモ帳でソースが開くだけです)
(コマンドラインからの実行でも同様です)
リターンコード
バッチファイル : %ERRORLEVEL%
PowerShell : $LastExitCode
コマンドライン引数
引数へのアクセスは、次のように行います。
バッチファイル :
%1~%9PowerShell :
$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
コメント