Powershell」カテゴリーアーカイブ

バッチファイルからPowershellのps1ファイルを実行する

以前Powershellのps1ファイルをダブルクリックで実行する方法についてエントリを書きました。

今回も似たような内容なのですが、今回は”Powershellを日常的に実行しない方にダブルクリックで実行してもらう”場合の話です。

相手がPCにあまり詳しくない方だった場合などにスクリプトが書かれたファイルを渡して、「とりあえずこのファイルを実行してもらえれば○○ができるようになるから」という運用ができると便利です。

ところが、Powershellスクリプトの実行はWindowsのデフォルトで制限されているので、実行してもらう前にPowershellの実行ポリシー(Executionpolicy)を緩める必要があります。

この実行ポリシー変更も含めてダブルクリックで行う際に、バッチファイルからps1ファイルを実行するようにするとうまく行くそうです。

コード

【bat】
@echo off
powershell -NoProfile -ExecutionPolicy RemoteSigned .\hoge.ps1

上記のバッチファイルを作成し、実行してもらいたいPowershellスクリプト(hoge.ps1)と同じフォルダに配置します。あとはバッチファイル側を実行してもらえれば連動してPowershellスクリプトが動くという寸法です。

ファイルが2つになってしまうのが少々難ですが、運用はやりやすいのではないかと思います。

パラメータについて

Powershellの実行コマンドのパラメータとして-NoProfileと-ExecutionPolicyという2つがありますが、まず-NoProfileはPowershell実行時に読み込む環境情報を読み込まないという設定です。今回想定している利用場面では無くても大丈夫そうなパラメータですが、念のための記述という感じです。

-ExecutionPolicyは実行ポリシーを設定するためのパラメータです。これを設定しているのがバッチファイルからの起動のポイントになります。

緩めた実行ポリシーはどうなるのか

必要に迫られているとは言え、今回はデフォルトからPowershellの実行ポリシーを緩和しています。これはスクリプト実行後どうなるのでしょうか。

今回のようにpowershell.exeの起動オプションとしてExecutionPolicyを指定した場合、設定した実行ポリシーは当該プロセス実行時しか有効にならないようです。つまり、スクリプト実行後設定が元に戻ります。特に必要ないのであればデフォルトの実行ポリシーにしておいた方がいいと思うので、この点安心です。

参考情報

以下の情報を参考にさせていただきました。ありがとうございました。

バッチファイルから PowerShell を呼び出す方法

PowerShellのExecutionPolicyのスコープとかについて詳しく

[Qiita]

About PowerShell.exe

[docs.microsoft.com]

Powershellで列が複数あるCSVを読み込む

以前ファイルの整理のためにファイル一覧をCSVに書き出したり、逆にImport-Csvコマンドレットで読み込む方法を調べました。

このImport-Csvコマンドレットですが、複数列あるCSVを読み込むとどうなるか気になったので、試してみることにしました。

試しに以下のようなカンマ区切りのCSVを作成します。

ID,名前
1,りんご
2,ぶどう
3,あんず

これをImport-Csvで読み込むと、以下のように読み取ってくれます。1行目がヘッダとして自動認識されます。

ID 名前
— —-
1 りんご
2 ぶどう
3 あんず
4 なし

この中から特定の値を取り出したい場合、変数に格納した上で処理ができます。

仮にC:\hoge内に”table.csv”があったと仮定すると、

cd C:\hoge

#CSVを読み込んで変数に格納
$csv Import-Csv table.csv

#添字”2”の"名前"の値を取り出す
$csv[2].名前

CSVを格納した変数には配列の要領でアクセスが可能です。例では添字を2にして名前の値を取り出しています。これを実行すると結果は”あんず”と出てきます。2なら”ぶどう”ではないのかと思うのですが、Powershellの配列の添字は0から始まっているので、2は”3番目の値”を示すことになります。

まだ触りだしたばかりでCSVと配列についてはこの程度しか理解できていないのですが、これも結構使い出がありそうに思えます。

Powershellでフォルダ名称をCSVに並べたり、CSVからフォルダを生成したりする

表題の通り、時々フォルダ内のフォルダ名をリスト化したくなったり、逆にリスト化したフォルダ名称を元にフォルダを自動作成したくなることがあります。

困った時のPowershellで実行可能です。なお、リストはCSVを前提としています。CSVだとExcelで読み書きもできるので、その点で便利です。

フォルダ名称をCSVにリスト化する

Get-ChildItem C:\hoge | Where-Object {$_.Attributes -eq "Directory"} | Select-Object PSChildName | Export-Csv foldername.csv -Encoding UTF8

上記のサンプルではC:\hoge直下のフォルダを一覧にしたCSV、forlername.csvを作成します。Where-Objectの部分でAttributesを使ってフォルダのみを指定しています。

次のSelect-Objectは、デフォルトのままだとフォルダの作成日やパスなどもCSVに出力してしまうので、フォルダ名称のみのリストにするために、値をPSChildNameに限定しています。

CSVからフォルダを作成する

仮に下記のようなデータが格納されたCSV、folder.csvがあったとします。先頭行のfoldernameはヘッダです。

foldername
hoge
piyo
fuga

続いて以下のコードを実行します。

Import-Csv folder.csv | ForEach-Object {New-Item $_.foldername -ItemType Directory}

これでカレントディレクトリにhoge piyo fugaの3つのフォルダが生成されます。

この2つのスクリプトを組み合わせると、フォルダ構造の把握の他にもファイルを除いたコピペのような操作もできるので重宝しています。必要であれば再帰実行用の-Recurseオプションをつけて頂くと便利なのではないかと思います。

PowerShellスクリプトをダブルクリックで実行する

PowerShellスクリプトは*.ps1形式というファイルに保存できますが、このファイルをダブルクリックしてもスクリプトは実行されません。

デフォルトの関連付けがメモ帳だからかと思いましたが、PowerShellの実行ファイルと関連付けをしてもうまく動いてくれません。この場合、別途ps1ファイルへのショートカットを作って、ショートカット経由で実行するとダブルクリックで動かせます。

PowerShellスクリプトへのショートカットを作成する

[@IT]

任意のタイミングで実行するタイプのスクリプトはこの方法で実行できるようにしておくと便利です。

Powershellでファイルをくじ引きする

ちょっと事情がございまして、何らかのプログラムで”特定のフォルダ内にあるテキストファイルをランダムに開く”方法を考えなければならなくなりました。

ネットで調べてみると抽選ツールといった名称でフリーソフトが色々あるのですが、今回はPCの制約上Windows付属の機能で実現しなくてはならないそうです。

そこで、不慣れながらPowershellでできないかを試してみました。

できあがったのがこれです。

$File = Get-ChildItem C:\lotto\*.* -Include *.txt | Get-Random
Invoke-Item $File

  1. Cドライブ直下に抽選用のlottoという名称のフォルダを作り、くじに相当するテキストファイルを入れておきます。
  2. プログラムはGet-ChildItemコマンドレットでlottoフォルダ内のテキストファイルをリスト化します。(-Include *.txtは要らないかと思いましたがくじ以外の物が保存されていると困るので念のためです)
  3. Get-Randomコマンドレットでランダムにリストから抽出が行われ、変数$Fileに格納されます。
  4. 2行目のInvoke-Itemで$Fileに格納したファイルを実行します。関連付けされている既定のプログラムで開く動作をします。

要は実行するとフォルダ内のテキストファイルをランダムにメモ帳で開いてくれるというだけです。あまり抽選めいた派手さはないですが、これでOKだと思います。

Powershellは今回初めて調べてみたのですが、ファイル管理などには有用そうな機能が色々あります。知っていると色々楽ができそうなのでおいおい自習しようかと思っています。