Python プログラミング Windowsショートカットの参照先サーバ名の変更

 見に来てくださって、ありがとうございます。石川さんです。

 たくさんあったWindowsのショートカットの参照先をスクリプトを使って一気に変えたくなったのですが、やり方がすぐに見つけられなかったので記録しておきます。サーバのリプレースやフォルダの整理等により、ショートカットの参照先が変わってしまって対応が必要になったときに使えます。どなたかのお役に立てば、うれしいです。

 すぐに見つけられなかったのは、「ショートカット」という名称がよくなかったようです。キーボードショートカットが検索結果の上位に登場してきます。試行錯誤して探し出しましたが、まずは参考になったのがこちらです。ここでショートカットの拡張子は「.lnk」らしい、ということと、win32com.clientのDispatchで”WScript.Shell”を使えばショートカットが作成できるらしい、と、アタリをつけました。
 今回は、ショートカットのプロパティの「リンク先(T)」「作業フォルダー(S)」を修正したかったのですが、上記で見つけたリンクでは「リンク先(T)」が「TargetPath」だ、ということしかわからなかったので、追加で「WScript.Shell」+「shortcut」+「property」で検索してこちらのページを見つけました。こちらで「作業フォルダー(S)」は「WorkingDirectory」ということがわかりました。

ショートカットのプロパティ

ソースコード

 ここまでわかればなんとかなる、ということでスクリプトを作成しました。Pythonです。

#!python
# -*- coding: cp932 -*-
# このスクリプトは指定したフォルダの中をくまなく操作して、
# ショートカットを見つけたときに、「置き換え前」を「置き換え後」に置き換えるためにつくりました。
# 変数を変更することで他の用途にも対応可能です。

import os
import win32com.client 

指定フォルダ = "Z:" + os.sep + "テストフォルダ"
置き換え前 = r"\\old_server" + os.sep + "shared_folder$"
置き換え後 = r"\\new_server" + os.sep + "shared_folder$"

shell = win32com.client.Dispatch("WScript.Shell")

for root, dirs, files in os.walk(指定フォルダ):
    for file in files:
        if file[-4:] == ".lnk":
            shortcut = shell.CreateShortCut(root + os.sep + file)
            if shortcut.Targetpath[:len(置き換え前)].lower() == 置き換え前.lower():
                changed_targetpath = 置き換え後 + shortcut.Targetpath[len(置き換え前):]
                shortcut.Targetpath = changed_targetpath
                shortcut.save()
            if shortcut.Workingdirectory[:len(置き換え前)].lower() == 置き換え前.lower():
                changed_workingdirectory = 置き換え後 + shortcut.Workingdirectory[len(置き換え前):]
                shortcut.Workingdirectory = changed_workingdirectory
                shortcut.save()

 まずは、一番のポイント、14行目のWScript.Shellですね。ここではCOMオブジェクトをディスパッチしています。これによりWindowsのWshShellオブジェクトの機能が利用可能になります。
 次は16行目ですが、os.walkを利用して、「指定フォルダ」配下のファイルをすべてチェックします。ここのforループのrootに、現在処理対象のフォルダ名、filesにそのフォルダ内にあるファイルのリストが取得できます。この取得したファイルリストをすべて処理し始めるのが、17行目のforループです。
 18行目では、ファイル名の最後の4文字を取り出して「.lnk」かどうかチェックしています。ショートカットは拡張子が「.lnk」になっています。そして、ショートカットの場合、19行目で「CreateShortCut」を使ってショートカットのオブジェクトを作成しています。作成する、と言っても元々がショートカットですので、ショートカットのショートカットが新しく作成されるわけではなく、現在の設定のショートカットを参照した形になります。ちなみに、os.sepは、セパレート文字列で、Windowsの場合「\」、Linuxの場合は「/」のように適切な区切り文字にセットされます。
 20行目で置き換え対象かどうかチェックして、対象なら「Targetpath」をセットすることで「リンク先」を更新して23行目の「save」メソッドで変更を確定する、ということをやっています。24~27行は同様ですが、「WorkingDirectory」をセットすることで「作業フォルダー」を更新しています。

まとめ

  やりたいことは難しいことでなかったのですが、既存のショートカットを更新したいのに「CreateShortCut」メソッドを使う、というところがちょっと馴染めない感じがしました。ま、慣れれば大丈夫ですね。

「LEARN LIKE A PRO 学び方の学び方」読了しました

今日も見にきてくださってありがとうございます。石川さんです。
久しぶりの更新です。

 「LEARN LIKE A PRO 学び方の学び方」バーバラ・オークレー/オラフ・シーヴェ/宮本喜一訳 アチーブメント出版を読了いたしました。

 ぼくは他の人と比べて読書量がまあまあ多い方じゃないかな、と思っています。ただ、最近は読み終わった本を見ても、ホントにこの本読んだんだっけ、という気持ちになることが増えてきました。このままではよくないなぁ、ということで読んだ書籍の記録も兼ねて感想などを書くことにしました。

 一番の収穫は、自分の学び方が結構ダメだった、ということがわかったという点ですね(笑)。もっとイケてると思っていたのですけど。内容は以下のような感じでしょうか。大きく分類すると、学習において考えなければいけない要素について、と、その取り組み方について述べられていたように思います。

 最初にポモドーロテクニックが紹介されていました。結構有名なテクニックなので、ご存知の方もいらっしゃると思います。25分間集中して、その後5分間休憩する、というサイクルを繰り返して勉強や仕事をするやり方です。集中して取り組むために必要なことを教えてもらえます。ちなみに、このポモドーロ、イタリア語でトマトのことだったのですね。

 次に行き詰まりを克服するという内容で集中モードと拡散モードについて教えてくれます。ぼくにとってはとても馴染みのある話でした。集中して考えたあとに、ふとひらめく、あの感じのことをわかりやすく教えてくれます。

 そして、学習の深さについて、教えてくれます。脳のシナプスが繋がっていく様と、その繋がりが太くなっていく様から、学習するということは脳の中のニューロンの結合を強く長くしていくことだ、というふうに教えてくれます。そしてその結合を強く長くしていく具体的な方法について教えてくれます。

 作業記憶という概念についても詳しく説明してくれています。最大限に活用する方法について具体的な方法が書かれており、その延長線上として、ノートの取り方について解説してくれています。「何よりも、肝心なことはノートをとることではない。大切な内容を頭に入れることだ」と言われて、目から鱗が落ちた気分です。

 記憶することについてもそのテクニックと重要性が述べられていました。ぼくはこの章を読むまでは、記憶することの重要性を軽んじていました。単に記憶するという概念にとどまらず、「内在化する」という表現でその重要性について語られていました。記憶することによって考える力の負担が軽くなり、より難しい概念について理解したり、問題を解決できるようになる、ということでした。言われてみれば当たり前のことなのですけど、そこまで掘り下げて考えていなかったので、ちょっぴりショックでした。

 ここまでが学習の要素なのかなぁ、というところなのですけど、これだけでもお腹いっぱいで、その後の取り組み方についてはまだ未消化です。何度も読み返して、いや、回収の実践をして、内在化したいと思う一冊でした。