2014年3月7日

【Access】 あれば更新なければ追加


データベースを使ったシステムを開発しているとよく本テーブルからデータを抽出して、ワークテーブルで編集してまた本テーブルに格納するなんてことをやるんですが、そんなとき2つのテーブルを比較して、データがあれば更新なければ追加といったことをします。




例えば次のようなテーブルがあったとします。

T_Animals(本テーブル)

このテーブルからデータをワークテーブルに持ってきて、変更と追加を行ったとします。

W_Animals(ワークテーブル)

4:サル → 4:キツネザル に変更
9:カバを追加

この更新と追加を本テーブルに反映させるにはクエリで次のようにやります。

2014年3月6日

【Access】独自メニューバーが他のファイルでも表示される



今日たまたま気づいたんですが、以前作ったAccessの独自メニューバーが、デフォルトで新規作成されたファイルにも表示されていたんです。

マジでビックリです。
ヤバいですよコレ。

だって、以前お客さんに作ったAccessのシステムのメニューが表示されちゃってんだもん。


ちょっと試しに新たにメニューバーを追加してみたんですけど、
やっぱり新規作成したものにもデフォルトで出てきますね。
Access2010なんでアドインのところに表示されています。


この現象が自分のPC内だけならいいんですけど、
まさか別の顧客のシステムにも勝手に表示されちゃってるなんてことないよね?

たぶんないことを祈りつつ、とりあえず削除する方法を探してみました。

2014年3月5日

【PowerShell】SQL Serverのデータベースを復元


PowerShellを使ってSQL Serverのデータベースを復元するやり方です。

今回もInvoke-Sqlcmdを使った方法です。

まず、PowerShellを管理者権限で立ち上げ、
SQLPSと打ち込んでください。

そして、次のように入力して実行してください。

Invoke-Sqlcmd "RESTORE DATABASE TESTDB FROM DISK = 'C:\work\backup\TESTDB.bak' WITH REPLACE" -ServerInstance "SVRNAME\SQLEXPRESS" -QueryTimeout 300

TESTDBはデータベース名です。
FROM DISKでファイル名を指定しています。
WITH REPLACEは上書きでの復元という意味です。

<参考サイト>
Invoke-Sqlcmd コマンドレット
RESTORE (Transact-SQL)
RESTORE の引数 (Transact-SQL)


2014年3月3日

【PowerShell】SQL Serverのデータベースバックアップ


システムでSQL Serverを使うことがあるのですが、コマンドで操作することがよくあります。

PowerShellでも当然SQL Serverを扱えるようになっています。

たとえばデータベースのバックアップは次のように行います。

まず、PowerShellを管理者権限で立ち上げ、
SQLPSと打ち込んでください。


このSQLPSユーティリティ(SQLPS.exe)を実行すると、コマンドレットやスクリプトでSQL Serverのインスタンスとそのオブジェクトを操作出来るようになるみたいです。

ただ、TechNetをいま見たらこの機能は将来削除される予定らしいです。
代わりにsqlps PowerShell モジュールを使ってくれとのことです。

まあちょっと時代遅れになってしまってるんですけど、今回はこのやり方で。


それで、データベースのバックアップですが、次のように行います。

Invoke-Sqlcmd "BACKUP DATABASE TESTDB TO DISK = 'C:\work\backup\TESTDB.bak' WITH FORMAT, NAME = 'TESTDB_20140303'" -ServerInstance "SVRNAME\SQLEXPRESS" -QueryTimeout 300

TESTDBというのはデータベース名です。
あと、NAMEというのは、バックアップセット名です。

<参考サイト>
BACKUP (Transact-SQL)
SQL Server PowerShell を使用した管理手法 第 2 回 実践編
Invoke-Sqlcmd コマンドレット

2014年2月28日

【PowerShell】2つのファイルを比較する



よく、2つのファイルを比較したい、特にソースコードで変更箇所を探し出したいといったことがあると思いますが、そのようなときはCompare-Objectを使います。


Compare-Object -ReferenceObject $(Get-Content C:\work\src1\Program.cs) -DifferenceObject $(Get-Content C:\work\src2\Program.cs)

この例では、2つのファイルC:\work\src1\Program.csとC:\work\src2\Program.csの比較を行っています。


-ReferenceObject は、比較の対象となるオブジェクトを示しています。

-DifferenceObject は、Reference オブジェクトと比較するオブジェクトを指定します。

$()はそれぞれGet-Contentで取得したオブジェクトが格納された変数?になるのだと思います。
すみません勉強不足でちょっと表現があいまいなのですが、おそらく変数だと思います。


それで結果は次のようになります。
この場合、両方のファイルには含まれていないが、どちらか一方のファイルに含まれている行のみを表示します。
つまり変更点だけ表示されます。

2014年2月27日

【PowerShell】サブフォルダのファイルも含めて文字列を検索する



指定した文字列を含んだファイルを探すとき、たいていの場合サブフォルダも含んだ状態で検索すると思うのですが、そういった場合は次のように行います。


Get-ChildItem . -include *.txt -Recurse -Force | Select-String "たぬき" -Encoding default


はじめの

Get-ChildItem . -include *.txt -Recurse

は、現在のディレクトリとそのサブディレクトリ内にある.txtファイルを全て取得しています。

ドット (.) は現在のディレクトリを表しています。
Includeはファイル名の拡張子を指定しています。
Recurseは再帰的にオブジェクトを取得することを意味します。
また、Forceを付けることにより隠しファイルも取得されます。


そして、取得したオブジェクトをパイプラインでSelect-Stringに渡しています。

うしろに付いている -Encoding defaultは日本語(S-JIS)を扱う場合のパラメータです。






<関連記事>
【PowerShell】ファイル検索
【PowerShell】ファイルから文字列を検索する
【PowerShell】2つのファイルを比較する
【PowerShell】ファイルを読み込む
【PowerShell】ファイル作成


2014年2月26日

【PowerShell】ファイルから文字列を検索する



ファイルに含まれる文字列を検索する、いわゆるgrep機能を行うにはSelect-Stringを使います。


構文は以下の通りです。
Select-String -Pattern [検索したい文字列] -Path [検索するファイル]

または、

Select-String [検索したい文字列] [検索するファイル]

PS C:\work> Select-String "hello" .\*.*



上の例では、カレントディレクトリのワイルドカード「*.*」のファイルの中から「hello」という文字が含まれているファイルを探しています。

ちなみに日本語を検索する場合はちょっと注意が必要です。

PS C:\work> Select-String "たぬき" .\*.* -Encoding default



文字コードがS-JISで作成されたファイルを検索する場合は、うしろに-Encoding defaultを付けてください。

UTF8の場合は、-Encoding UTF8と指定してください。


<関連記事>
【PowerShell】サブフォルダのファイルも含めて文字列を検索する
【PowerShell】ファイル検索
【PowerShell】2つのファイルを比較する
【PowerShell】ファイルを読み込む
【PowerShell】ファイル作成


2014年2月25日

【PowerShell】ファイル検索



PowerShellでファイルを検索するには、Get-ChildItemを使います。


基本構文は次の通りです。
Get-ChildItem [ファイル名]

PS C:\work> Get-ChildItem "*.jpg"



この例では、C:\data\tmpでjpg拡張子の付くファイルを検索しています。

ちなみにこの方法だと、そのフォルダ内しか検索してくれません。

サブフォルダも検索したい場合は、-Recurseをつけます。

PS C:\work> Get-ChildItem C:\data\tmp "*.jpg" -Recurse


ただここで注意しなければいけないのは、検索を開始する親フォルダを指定しないといけないことです。
上の例では、C:\data\tmpの部分です。


<関連記事>
【PowerShell】ファイルから文字列を検索する
【PowerShell】ファイルをコピーする
【PowerShell】ファイルを削除
【PowerShell】ファイルを読み込む
【PowerShell】ファイル作成


2014年2月24日

【PowerShell】ファイルに追記する


PowerShellでファイルに追記するには、Add-Contentを使います。

たとえば以下の内容のファイルがあったとして、ここに「えんがわ」を追加したいとします。

その場合、次のようにします。

PS C:\work> Add-Content -Path C:\work\寿司ネタ.txt -Value "えんがわ"


このように一番下に「えんがわ」が追加されました。


2014年2月21日

【PowerShell】ファイルに書き込み


ファイルに書き込むには、Set-Contentを使います。


PS C:\work> Set-Content -Path C:\work\test.txt -Value "やっほー"

上の例では、C:\work\test.txtというファイルに「やっほー」と書き込んでいます。

ちなみに-Pathと-Valueは省略できます。

また、-Pathで指定したファイルが存在しない場合は、自動で作成してくれます。


2014年2月20日

【PowerShell】ファイル作成



PowerShellでファイルを作成するには、New-Itemを使います。




PS C:\work> New-Item -Path [ファイル名] -Value [ファイルの内容] -Type file

ちなみに-Pathと-Valueは省略できます。

-Typeはfile以外にdirectoryもあって、directoryを指定するとフォルダが作成されます。



-Valueに指定すると、内容を書き込んでファイルを作成してくれます。

PS C:\work> New-Item -Path C:\work\Hello.txt -Value "Hello!" -Type file

この例では、"Hello!"と書き込んだC:\work\Hello.txtファイルを作成しています。


<関連記事>
【PowerShell】ファイルをコピーする
【PowerShell】ファイルの移動
【PowerShell】ファイルを削除
【PowerShell】ファイルを読み込む
【PowerShell】ファイル検索


2014年2月19日

【PowerShell】ファイルを読み込む



PowerShellでファイルを読み込むにはGet-Contentコマンドレットを使います。




PS C:\work> Get-Content -Path [表示させたいファイル名]

ちなみに、-Pathは省略できます。


<関連記事>
【PowerShell】ファイル作成
【PowerShell】ファイルをコピーする
【PowerShell】ファイルを削除
【PowerShell】ファイル検索
【PowerShell】フォルダを移動する

2014年2月18日

【PowerShell】コマンドレットのヘルプを表示する


PowerShellを使っててヘルプを見たいと思ったのですが、DOSプロンプトみたいに/?を打ち込んでも「そんなパラメーターは存在しないぞ!」って怒られてしまうんですよね。

で、調べたら次のようにやるみたいです。


たとえばCopy-Itemのヘルプは、

PS C:\work> Copy-Item -?

これが一番簡単なやり方なんですが、-?を付けるだけです。
なんでスラッシュじゃねぇんだよと思いますがこうするんですね。



それで、あと他に2つやり方があります。

PS C:\work> Help Copy-Item

PS C:\work> Get-Help Copy-Item

Help [コマンドレット名]

または

Get-Help [コマンドレット名]

2014年2月17日

【PowerShell】フォルダの削除


フォルダを削除するには、ファイルと同じでRemove-Itemを使います。

構文
Remove-Item [削除したいフォルダ]

例えば、C:\Data\tempフォルダを削除する場合は、

Remove-Item C:\Data\temp

こうなるんですが、

ただ、注意してほしいのは、削除したいフォルダの中にサブフォルダが含まれていると確認のメッセージが表示されます。

確認
C:\Data\temp の項目には子があり、Recurse
パラメーターが指定されていませんでした。続行した場合、項目と共にすべての子が削除されます。続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):

こんな感じです。

そのまま削除する場合は、Enterを押すか、Yを入力してEnterを押してください。


2014年2月14日

【PowerShell】ファイルを削除



ファイルを削除するには、Remove-Itemを使います。

構文
Remove-Item [削除したいファイル]


Remove-Item C:\Data\tmp\document\仕様書.docx

こんな感じです。


ただ、注意しなければいけないのは、読み取り専用ファイルは削除できません。
その場合、-forceパラメータを追加してください。

Remove-Item C:\Data\tmp\document\仕様書.docx -force

こんな感じです。


<関連記事>
【PowerShell】ファイルをコピーする
【PowerShell】ファイルの移動
【PowerShell】ファイルを読み込む
【PowerShell】ファイル作成
【PowerShell】ファイルを削除


2014年2月13日

【PowerShell】ファイルの移動



ファイルの移動は、Move-Itemを使います。

構文
Move-Item [移動したいファイル] [移動先フォルダ]

Move-Item C:\Data\tmp\document1\仕様書.docx C:\Data\tmp\document2\

この例では、C:\Data\tmp\document1\仕様書.docx を C:\Data\tmp\document2フォルダに移動します。


ちなみに、Move-Itemは移動先に同じ名前のファイルがあると怒られます。

もし上書きでファイルを移動したい場合は、-forceパラメーターを追加してください。

Move-Item C:\Data\tmp\document1\仕様書.docx C:\Data\tmp\document2\ -force

こんな感じです。

2014年2月12日

【PowerShell】上書きコピーしないようにする方法


上書きしないようにコピーするやり方です。


Copy-Item C:\Data\tmp\document\仕様書.docx C:\Data\tmp\backup -confirm

Copy-Itemコマンドレットを使用するときに、後ろに-confirmを付けるだけです。

これを実行すると、

確認
この操作を実行しますか?
対象 "項目: C:\Data\tmp\document\仕様書.docx コピー先: C:\Data\tmp\backup\仕様書.docx" に対して操作 "ファイルのコピー"を実行しています。
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):

このようなメッセージが表示されます。

実行する場合はそのままEnterか、Yを入力してEnterです。


<関連記事>
【PowerShell】ファイルをコピーする
【PowerShell】ファイルの移動
【PowerShell】ファイルを削除
【PowerShell】ファイルを読み込む


2014年2月11日

【PowerShell】ファイルをコピーする



こういったコマンド操作でよく使うと思われるのは、やっぱりファイル操作なんじゃないかと思います。
DOSコマンドでもXCOPYとかDIRはよく使いますからね。

では最初にファイルのコピーをやってみたいと思います。

コピーは、Copy-Itemというコマンドレットを使います。

Copy-Item C:\Data\tmp\image1\001.jpg C:\Data\tmp\image2\

C:\Data\tmp\image1\フォルダにある001.jpgというファイルを、C:\Data\tmp\image2\にコピーするやり方です。


次に複数のファイルをまとめてコピーするやり方です。

Copy-Item C:\Data\tmp\image1\* C:\Data\tmp\image2\

C:\Data\tmp\image1\フォルダにある全てのファイルを、C:\Data\tmp\image2\にコピーするやり方です。


ちなみに、コピー先のフォルダに同じ名前のファイルがあっても、有無を言わさず上書きコピーされちゃいます。
他に上書きコピーしないやり方があるのかもしれませんが、注意しないといけないですね。


<関連記事>
【PowerShell】ファイルの移動
【PowerShell】ファイルを削除
【PowerShell】ファイルを読み込む
【PowerShell】ファイル作成
【PowerShell】ファイル検索


2014年2月10日

【PowerShell】スクリプトポリシーを設定する


仕事でPoserShellを使ってみようと思って勉強してたんですが、いきなりつまづきました。


Write-Host "Hello world"

例によって、「Hello World!」を表示させるスクリプトを書いたんですが、エラーになっちゃうんですね。


で、いろいろ調べたら、デフォルトでは安全のためにスクリプトが実行できない状態になってるんですね。

実際に確認してみると、

PS C:\work> Get-ExecutionPolicy
Restricted

Restrictedになっていました。

2014年2月7日

VisualSVN ServerとTortoiseSVNを使ってバージョン管理 (5)

前回、インポートまで終わりました。
今回は、実際にチェックアウトとコミットをやってみたいと思います。



まずはチェックアウトです。

チェックアウトとは、リポジトリから作業コピーを取り出すことをいいます。


最初に、取り出したファイルを格納する作業フォルダを作成しておきます。

今回は、C:\work\HelloWorldというフォルダを作成しました。

このフォルダ上でショートカットメニューを開き、「SVNチェックアウト」を選択します。

2014年2月6日

VisualSVN ServerとTortoiseSVNを使ってバージョン管理 (4)

TortoiseSVNのインストールと設定が出来たところで、では実際にファイルを登録してバージョン管理を行っていきたいと思います。

ここでは、ド定番の「HelloWorld」というC#プロジェクトを登録します。



最初にリポジトリにプロジェクトのフォルダを作成します。

リポジトリブラウザの「repo1」右クリックし、「フォルダの作成」をクリックします。

2014年2月5日

VisualSVN ServerとTortoiseSVNを使ってバージョン管理 (3)

前回、リポジトリの作成まで終わったので、
今回からクライアント(TortoiseSVN)のほうの作業を進めていきます。



まずは最新版を下記サイトからダウンロードしてください。
http://tortoisesvn.net/downloads.html

また下のほうに言語パックもあるので、日本語のものを一緒にダウンロードしてください。


まずは本体のインストールです。
ダウンロードしたファイルを実行します。

「Next」をクリック。

2014年2月4日

VisualSVN ServerとTortoiseSVNを使ってバージョン管理 (2)

前回、VisualSVN Serverのインストールが完了したところからの続きです。

とりあえず起動してみたいと思います。

起動するとこんな画面が表示されます。

このあとユーザーの作成、リポジトリの作成へと続きます。





2014年2月3日

VisualSVN ServerとTortoiseSVNを使ってバージョン管理 (1)

最近、新たにソフトウェアを作ったのでSubversionに登録しようと思ったんですが、残念ながらすっかりやり方を忘れてしまっていました。ほんとに自分の記憶力の無さに嫌気がさすんですが、まあ仕方ないのでネットとかでやり方を調べながらなんとか登録したんですが、せっかくなので同じように困っている人の役に立てばいいかなと思ってブログに載せることにしました。

私がやったのは、VisualSVN ServerとTortoiseSVNを使ったバージョン管理です。

サーバー(Windows Home Server)にVisualSVN Serverを入れて、
クライアント(Windows 7)にTortoiseSVNをインストールします。

たぶん普通のSubversionでもいいと思うんですけど、やっぱりビジュアルなほうが分かりやすいんでこれを使いました。




2014年1月28日