""
[PowerShell] ZoneIDとPowerShellの実行ポリシー
PowerShellでちょっとしたツールを動かそうと思って、初歩的なところであれ?となったので、書いておきます
PowerShellの実行ポリシー(Execution Policy)は、
|
|
このコマンドで確認できます
Windows10のデフォルトでは Restricted になっていて、ps1 ファイルをコマンドライン上から実行することが出来ません
なので
|
|
を実行して、 RemoteSigned にセキュリティポリシーを変更します
しかし、RemoteSigned になってることを確認したのに、
しかしなぜか、ps1 ファイルの実行時にセキュリティエラーとなってしまいました
なんだこれ(↓)は…?
|
|
なんでだろーと思ってたのですが、何てことはない
実行しようとしてた ps1 ファイルは、インターネット越しに入手したものでした
(自分のサイトから落としてきたんだけどね)
こんな感じ↓↓↓
どうやら、インターネット越しに入手したファイルには ZoneID というのが付与されるらしく
Windowsはローカルファイルと区別出来るようにしてくれてるんですね~
ローカルファイルとして扱いたい時には、ポチっと「ブロックの解除」を押せばOKです
ちゃんと、ps1 ファイルが動作するようになりました(^^♪
ZoneID…知らなかった…><。
参考:
- WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する - @IT
http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html
[PowerShell] ファイル分割スクリプト
大きなファイルを分割する必要があって
めっちゃ困りましたけど、また PowerShell で解決しました
なかばやけくそ
<sep.ps1>
|
|
結果
あまり何も考えず、元ネタはこの方のブログですー
- 参考サイト:powershellが超便利 - fivegangstersのブログ
http://blog.livedoor.jp/fivegangsters/tag/powershell
[PowerShell] 連想配列をソートしてforeachで一個づつ取り出す
PowerShell で連想配列を用いた時のソート&foreach のサンプルがなかなか探せなかったのでメモします
とある連想配列
PS C:\> $tbl = @{
>> k00 = "orange";
>> k01 = "peach";
>> k02 = "apple"
>> }
出力は簡単
PS C:\> $tbl
Name Value
---- -----
k01 peach
k02 apple
k00 orange
ソートの出力も簡単
PS C:\> $tbl.GetEnumerator() | Sort-Object Value
Name Value
---- -----
k02 apple
k00 orange
k01 peach
# もしくは
PS C:\> $tbl.GetEnumerator() | sort Value
Name Value
---- -----
k02 apple
k00 orange
k01 peach
これを一つづつ取り出して処理したい
単に foreach で取り出すとき
PS C:\> foreach( $k in $tbl.Keys ){
>> Write-Output $k
>> Write-Output $tbl[ $k ]
>> Write-Output '-----'
>> }
k01
peach
-----
k02
apple
-----
k00
orange
-----
さらにソートして foreach で取り出すとき
PS C:\> $tbl.GetEnumerator() | sort Value |
>> ForEach-Object{
>> Write-Output $_.Name
>> Write-Output $_.Value
>> Write-Output '-----'
>> }
k02
apple
-----
k00
orange
-----
k01
peach
-----
ForEach-Object を使いました ただの foreach() でも出来ると思うんですけど、私的用途が満たせたので、これ以上は調べてないです
検索で、「powershell foreach ソート -perl」 などで検索しても、日本語の情報があまり出てこなかったので、参考になれば幸いです(^^)
[PowerShell] 32bitと64bitの使い分け
PowerShellにはちゃんと 32bit版と 64bit版が備わっています
Windows2008 R2
Windows2012 R2
共に同じ場所にあります(~o~)
64bit版
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
32bit版
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
デフォルトの64bitマシンであれば、コンソールで
> powershell
とすると、64bitモードが立ち上がります
これはどういうことかというと、64bitのアプリから使うライブラリなどは、64bitでないとダメってことです
何にはまったかというと、PowerShell から System.Data.OracleClient に接続するとき
たとえDBサーバが 64bit Oracle だったとしても
Oracle Client はデフォルトでは 32bit になっているようです
powershell から oracle に接続しようとしたときこんな感じになります
# アセンブリのロード
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient")
# 接続
$conn_str = "Data Source=saoDB;User ID=sao;Password=password;Integrated Security=false;"
$ora_conn = New-Object System.Data.OracleClient.OracleConnection($conn_str)
# インスタンス
$ora_cmd = New-Object System.Data.OracleClient.OracleCommand
$ora_cmd.Connection = $ora_conn
# データベースに接続
$ora_conn.Open()
(参考)powerShellからOracleを使う(接続・切断)
http://harikofu.blog.fc2.com/blog-entry-114.html
このDB接続直後に、64bit のPowerShell だと
こんなエラーが出ます
"0" 個の引数を指定して "Open" を呼び出し中に例外が発生しました: "Oracle クライアント ライブラリを読み込もうとしましたが、BadImageFormatException が発行されました。この問題は、32 ビットの Oracle クライアント コンポーネントが
インストールされている環境で 64 ビット モードを実行すると発生します。"
発生場所 行:1 文字:22
+ $ora_conn.Open <<<< ()
+ CategoryInfo : NotSpecified: (:) []、MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
問題解決方法は2つ
- Oracle Client を 64bit版をインストールする(たとえDBサーバ上であっても…
- 呼び出す側のPowerShellを 32bit版にする
既存の稼働環境に影響を与えない様にするという意味では
不毛ですが後者を選択すると波風立てずにコトを済ませられます