【Powershell】ファイルの中身を一括でリネーム

共通の名前がついているファイルの名前を
一括して変更したい場合がありました。
そこで調べたらpowershellにはrename -itemという命令がありました。
使い方は以下のように

#アセンブリの読み込み
[void][System.Reflection.Assembly]::Load("Microsoft.VisualBasic, Version=8.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")
#コピーした先のフォルダに移動
cd $targetPath
#リネーム実行
dir | rename-item -newname { $_.name -replace $targetName,$newName }

cdコマンドでファイル名を変えたいフォルに移動して
dirでフォルダの一覧を表示します。
その後rename-itemでファイル名を変更しています。

この場合targetNameをnewNameに変更しています。

結構需要があるみたいですね(´・ω・)

【Oracle】ora-01033エラー

ora-01033 ORACLE initialization or shutdown in progress

久しぶりにDBを接続したときにora-01033エラーがでて
接続できなくなってしまいました。
いろいろ試したのですが、バックアップファイルが
残っていなかったため、ORACLEそのものを入れ直しました。
すごく残念な結果になってしまいましたがそのときの手順を残しておきます。

・やったこと
sqlplusにsysdbaでログイン

 sqlplus / as sysdba

ラクルを起動

SQL> ALTER DATABASE OPEN RESETLOGS;

ここで'C:\oraclexe\app\oracle\oradata\XE\REDO2.DBF';がリカバリーが必要ですと
エラーがでます。

そこで、rmanにログイン

  rman target /

先ほどのファイルをリカバリーしようとする

RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;

ここで以下のようなエラーになる
f:id:topvalue:20180118205556j:plain
restoreコマンドが失敗しましたとなるともうリカバリーすることができないようです。

ORACLEをアンインストールして、ユーザーとテーブルスペースを再作成して
DBに接続できることを確認しました。

【Powershell】Excel関数をつかう

SUMやSUBTOTAL関数を使う

powershellではExcelで使える関数がほぼそのまま使用できます。
意外と使い方の説明がないと思ったので書いておきます。

・SUM関数
さっそくSUMの使い方です。
関数の中で関数を使う場合ちょっと工夫がいります。

#excelを宣言しているとして
#セル1,6にSUM関数を含むIF関数を設定
for($index = 1; $index -le 100; $index++) {
  $excelSheet.Cells.Item(1,6) = "=IF(C$index="""","""",SUM(H${index}:O${index}))"   
}

ポイントはSUM関数の中の変数の宣言です。
$変数でそのまま宣言しても見てくれないので、中かっこ{}で囲みます。
中かっこで囲むことで、変数であることを宣言しています。
H$(index)とすることで、indexがインクリメントされていきH列を対象にできます。

・SUBTOTAL
つづいてはフィルタをかけたときの件数をしるために
SUBTOTALを使う場合です。

#hensuでフィルタをかける
$excelSheet.Range("A4:X4").AutoFilter(2, $hensu)
#フィルタをかけた件数を取得
$filtaAllCount = $excel.WorksheetFunction.Subtotal(3,$excelFile1.ActiveSheet.Range("A:A"))
#フィルタのヘッダの件数だけ減らす
$filtaCount = $filtaAllCount - 2

AutoFilterの使い方はVBAと同じですね。
ここでは$hensuでフィルタをかけています。
フィルタをかける範囲はRangeで指定してこの場合A4からX4までを指定しています。
Subtotalを使う場合、WorkSheetFunctionをかませて使います。
ここではアクティブなシートのA列すべてを指定しています。

そしてsubtotalではフィルタをかけた列もカウントされてしまうので
その分マイナスしています。

VBAとは若干使い方がちがうので注意してください。

【Windows Update】windows updateエラー

Windows Update更新中にエラーになる

windowsupdateの更新中にエラーになり、エラーコードもnull
なので、エラーコードでも調べられないことがありました。

windowsupdateエラーのなかで、windowsフォルダ配下の更新履歴フォルダを
削除すると解消する方法があったのですが、その方法では解消されませんでした。

クリーンブートで解消

いろいろ試した結果、クリーンブートで解消されました。
https://support.microsoft.com/ja-jp/help/929135/how-to-perform-a-clean-boot-in-windows

上記のURLの詳細情報で適切なOSを選んで実行してください。
簡単に抜粋すると、msconfig.exeで「Microsoft のサービスをすべて隠す」を選んで
その状態でwindowsupdateの更新をすれば更新ができるようになります。

更新が終わったらサービスを再度開始させてくださいね。

しかし、Microsoftのサービスを停止させればできるだなんて
何かと競合でもしてるんでしょうか。

ねぇ。

【Excel】実務時間の変換 

7.75hを7.45に変換する方法

勤務時間などで一日7.75hや7.45で記述することありますよね。
その変換方法を書いていきたいとおもいます。

Excelでは1900年1月1日を1として通算日数を持っていて
シリアル値というそうです。
詳しくは下記URLを参考にしてください。
osanaikohei.com


それを利用して、7.75を24で割るとシリア値になります。
f:id:topvalue:20180115215204j:plain

この値をセルの書式設定→ユーザー設定でh:mmなどで
設定してあげると7.75が7.45になります。
f:id:topvalue:20180115215510j:plain

意外と使いどころがあるのではないでしょうか。

【Powershell】シングルスレッドとマルチスレッド

powershellで実行」をするとエラーになる

前回powershellでUIの実装方法を書きましたが、そのバッチを右クリックの
powershellから実行]をするとエラーになることがありました。

いろいろ調べた結果、スレッドセーフかどうかが問題なようです。
comオブジェクトに中にはスレッドセーフ(STA)でなければいけないものがあり、
powershellのデフォルトはMTA(マルチスレッド)なので、
エラーになるとのことです。

ただし,powershell v3.0以降は
powershell実行がデフォルトでスレッドセーフになっているためこの問題はおきないみたいです。
因みにpowershell ISEはデフォルトでスレッドセーフなので、エラーにはなりません。

しかし、職場などで勝手にバージョンを上げられない場合なんかは使用している
バッチをSTAモードで起動しなくてはなりません。

どのようにすればいいか下記サイトを参考にさせていただきました。
sevenb.jp

if( ([Threading.Thread]::CurrentThread.GetApartmentState()) -eq "MTA"){
    #STAモードで自分自身をよぶ
    powershell -sta -file $MyInvocation.MyCommand.Path
}

MTAモードの場合STAモードで自分を呼びだしています。

$MyInvocation.MyCommand.Path

これで自分がいるパスを取得できます。

右クリックで実行できないときはホントあせりました。
実行はpowersell ISEからのほうがいいみたいですね。

powershellでなくても、
UIを使う場合スレッドセーフかどうかは考えなくてはいけないことのようです・・・

【Powershell】ドラッグ&ドロップの実装

PowershellでUIを実装する

Poweshellには多彩なUIが実装されています。その中でもドラッグ&ドロップできるエリアを使用してみたいと思います。
下記サイトを参考にさせていただきました。と言ってもまるまるコピペです笑
letspowershell.blogspot.jp

Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
#formのサイズ
$form.Size = "500,300"
$form.StartPosition = "CenterScreen"
$form.Text = "タイトル"

#リストボックスの生成
$Listbox =  New-Object System.Windows.Forms.ListBox
$Listbox.Location = "10,10"
#リストボックスのサイズ
$Listbox.Size = "470,200"
#ドラッグ&ドロップを許可
$Listbox.AllowDrop = $True

# ドラッグエンター イベント
$Enter = {
  $_.Effect = "ALL"
   #write-host "このタイミングです!!"
}
#addしないとドラッグできない
$Listbox.Add_DragEnter($Enter)

#ドラッグドロップ イベント
$Drop = {
    $Name = @($_.Data.GetData("FileDrop"))
     #1つずつ取得し、リストボックスに追加
    For ( $i = 0 ; $i -lt $Name.Count ; $i++ )
    {
        $Listbox.Items.Add($Name[$i])
    }
}
#addしないとドロップできない
$Listbox.Add_DragDrop($Drop)

#開始ボタン
$Button = New-Object System.Windows.Forms.Button
$Button.Location = "200,220"
$Button.size = "80,30"
$Button.text  = "開始"
$Button.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.Controls.AddRange(@($Listbox,$Button))
$Form.Showdialog()

これで、ドラッグエリアが表示されるので、ドロップしたファイルのパスが表示されます。
この実装によりファイルパスの取得が楽になりました。

ドロップしたファイルパスは$Listboxに格納されていきます。
なのでこれを使用してファイルをオープンなど使用しています。

 #ドロップしたExcelファイル1を開く
$path = $Listbox.Items[0]
$excelFile1 = $excel.Workbooks.Open($path)
 #ドロップしたExcelファイル2を開く
$path2 = $Listbox.Items[1]
$excelFile1= $excel.Workbooks.Open($path2)

UIを実装したときはPowershell ISEから実行してください。
powershellコンソールや右クリックの「powershellで実行」をするとエラーになります。

原因は実行時のSTAとMTAモードの違いなんですが、それはまた次回ということで~