PowerShellでUnzip

これに関して検索するとたくさん出てくることと思いますが、Windowsのシェルを使わないとできないんです。つまり、Server Core環境ではShellがないので、

$shell = New-Object -ComObject Shell.Application

も使えないことがあります。そこで、.NET Framework 4.5に登場したSystem.IO.Compression.ZipFileを以下のように使うと簡単にZipファイルがPowerShellで解凍できてしまいます。当然のことながら.NET Framework 4.5はインストールしておく必要があります。

function ExtractZipFile([string]$filePath, [string]$destination)
{
    #Assemblyを読み込む。
    [System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null
    #ファイルを解凍。
    [System.IO.Compression.ZipFile]::ExtractToDirectory($filePath, $destination)
}

PowerShellでディレクトリ内にある最新のディレクトリを取得する

関数にしてしまいましたが、一行でできちゃいますね。

function GetLatestChildDirectory($rootDir)
{
    return (dir $rootDir | where {$_.PSIsContainer} | sort CreationTime -desc | select -f 1)
}

PowerShellでリモートマシンのサービスをリストする

多くのコンピューターを管理をすることはIT関係の仕事をしているとよくあることです。特に最近は仮想マシンの技術が発達して、より多くのコンピューターを管理する機会が多くなりました。それぞれのコンピューターにリモートログインをしてあるWindowsサービスがインストールされているかどうかをチェックするのは、数台のコンピューターだったら大したことはないのですが、10台、20台になるとそれだけで結構時間のかかるものです。

そこで、PowerShellのスクリプトでリモートマシンのWindowsサービスをリストすることができます。以下の例ではすべてのリモートマシンが同じ資格情報(Administrator)を使用できるものとします。

$credential = Get-Credential -Credential Administrator 
$computers = "server1","server2","server3","server4","server5","server6" 
foreach($computer in $computers)
{    
     " $computer ================"    
     $allServices = Get-WMIObject Win32_Service -computer $computer -credential $credential    
     $allServices | where{$_.DisplayName -match "integration"} | Format-List -Property DisplayName
}

Windowsのコマンドラインで履歴を保存

特に開発者ならWindowsでコマンドラインを使用していろいろ仕事をすることが多いと思いますが、コマンドラインって一回閉じちゃうと履歴が全部消えちゃいますよね。Ctrl+Vで貼付けだってできないし、結構不便。そんな痒いところに手が届くソフトがclink。オープンソースで無料のようです。

Windows ServiceをPowerShellでまとめ削除

開発の仕事をしていると、サービスアプリを何度もインストールしなければならないことがあります。同じような名前のサービスアプリがサービスにズラリと並んでしまうことがあります。それらをまとめて削除できちゃうスクリプを書いてみました。Get-Serviceの後のフィルターを工夫して使ってみてください。

$services = Get-Service "My service *"
foreach ($service in $services)
{
    $filter = "name='" + $service.ServiceName + "'"
    $serviceToDelete = gwmi Win32_Service -filter $filter
    if ($serviceToDelete -ne $null)
    {
        $serviceToDelete.Delete()
    }
}

シリアライズ可能なHashtable

メモ程度に載せておこう。

    public class SerializableHashtable : Hashtable, IXmlSerializable
    {
        public XmlSchema GetSchema()
        {
            return null;
        }

        public void ReadXml(XmlReader reader)
        {
            // Start to use the reader.
            reader.Read();
            // Read the first element ie root of this object
            reader.ReadStartElement("dictionary");

            // Read all elements
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                // parsing the item
                reader.ReadStartElement("item");

                // PArsing the key and value 
                string key = reader.ReadElementString("key");
                string value = reader.ReadElementString("value");

                // en reading the item.
                reader.ReadEndElement();
                reader.MoveToContent();

                // add the item
                Add(key, value);
            }

            // Extremely important to read the node to its end.
            // next call of the reader methods will crash if not called.
            reader.ReadEndElement();
        }

        public void WriteXml(XmlWriter writer)
        {
            // Write the root elemnt 
            writer.WriteStartElement("dictionary");

            // Fore each object in this
            foreach (object key in Keys)
            {
                object value = this[key];
                // Write item, key and value
                writer.WriteStartElement("item");
                writer.WriteElementString("key", key.ToString());
                writer.WriteElementString("value", value.ToString());

                // write </item>
                writer.WriteEndElement();
            }
            // write </dictionnary>
            writer.WriteEndElement();
        }
    }

Linux (Ubuntu Server)

最近Linuxが面白い。何だろこのギーク感。コマンドを打って、自分の命令をコンピューターが忠実に実行してくれるのが面白い。

今はMacMiniにUbuntu Serverをインストールして、OpenVPNに挑戦中だ。なんとも難しいが、完成したらまとめたいなあと思っている。

Debianをインストールしてからの必要な設定

Debianをインストールしていろいろやってみようとして「あれ?できない。あれ?」というのがいろいろあったので、自分用のメモ程度にブログしておきます。1以外は本当に自分の好みですのであしからず。

  1. 必要なアカウントをsudoerに追加する。
    su root
    adduser 自分のユーザー名 sudo
    再起動
      
  2. デスクトップアイコンを有効にする。(これは自分の好み)
    端末(Terminal)からgnome-tweak-toolと入力して、それを起動する。そして “Have file manager handle the desktop”と”Network Servers icon visible on the desktop”をオンにする。これでメニューからデスクトップにショートカットを作成することができる。
    Screenshot_from_2013-11-09 03:16:27.png
  3. 「ソフトウェアの追加と削除」の検索でvpncと入力してCisco-compatible VPN clientをインストールする。(これも自分の好み)
  4. 次にDropboxを端末からインストール。(これも自分の好み)
    $ wget https://www.dropbox.com/download?dl=packages/ubuntu/dropbox_1.4.0_i386.deb
    ダウンロードが終了してから、そのファイルをdropbox.debとファイル名を変更して、
    sudo dpkg -i dropbox*
    と入力をする。
  5. インストールが終了してからアプリケーション→インターネット→Dropboxをクリックしてインストール、セットアップをする。