HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2018/11/09

ファイルの情報を右クリックの「送る」でクリップボードにコピーするアプリ WSHプログラム

(Windows Script Hostプログラムなのでユーザーが自由にカスタマイズ可能なファイル情報クリップボード コピー アプリ)

Tags: [Windowsアプリ]




●ファイルの更新日付とサイズの情報を簡単操作でクリップボードにコピーしたい!

 下記の ShellExt x64 エクスプローラ用拡張メニューをダウンロード戴いた方からメールで「ファイルの更新日付とサイズの情報をコピーできないのか?」とお問い合わせを戴きました。

2018/02/24
ShellExt x64 Windows 10、64bit対応、Vista/7対応のエクスプローラ用拡張メニュー
ShellExt x64 Windows 10、64bit対応、Vista/7対応のエクスプローラ用拡張メニュー

  コンテクスト メニュー 拡張、右クリックでファイル名のコピー、テキスト/ 16進表示[Unicode対応]

 「ファイル名」や「パス付きのファイル名」の情報をクリップボードにコピーする機能は有りますが、更新日付やサイズの情報をコピーする機能は有りませんでした。

 と言う訳で、同様の機能を実現できるアプリを Windowsの WSH(Windows Script Host)プログラムで作成してみました。

 WSHで作成する事で、更に細かい要望にユーザー自身で柔軟にカスタマイズ(改造)が可能となります。

 デメリットとしては、Windows Script Hostの制限の為に対象とするファイルのファイル名が Shift JISである必要が有ります。UTF-8のファイル名では WSHプログラムが処理できないのでエラーになります。(ファイルの在るフォルダ名に関しても同様の制限が有ります)

 また、Clip.exeと言う Windowsに付属のクリップボードアプリを使用しており、コマンドラインを経由する事から同じく Shift JIS制限が発生しています。

 UTF-8対応が必要な場合は何かしらの「プログラム」を作成する必要が有ります。

●ファイル情報クリップボードコピー.vbs

 ・本ファイルは SHIFT-JISで保存
 ・ファイル情報クリップボードコピー.vbs にリネームする
 ・エクスプローラのアドレス欄に SendToを入力で「送る」設定フォルダに移動して、本 .vbsファイルをコピーする
 ・SendToフォルダに入れて、ファイルを「右クリック」「送る」での使用を想定
 ・ファイルの情報を「yyyy-mm-dd_hh-mm-ss 123,456,789」でクリップボードに保存する
 ・日本語ファイル名限定 文字コード SHIFT-JIS制限

 ライセンスは
 ・GNU General Public License v3.0
GNU General Public License v3.0

ファイル情報クリップボードコピー.txt
' 本ファイルは SHIFT-JISで保存
' ファイル情報クリップボードコピー.vbs にリネームする
' エクスプローラのアドレス欄に SendToを入力で「送る」設定フォルダに移動して、本 .vbsファイルをコピーする
' SendToフォルダに入れて、ファイルを「右クリック」「送る」での使用を想定
' ファイルの情報を「yyyy-mm-dd_hh-mm-ss 123,456,789」でクリップボードに保存する
' 日本語ファイル名限定 文字コード SHIFT-JIS制限
' Copyright (c)2018 FREE WING, Y.Sakamoto

Set fso = CreateObject("Scripting.FileSystemObject")

str = ""
For I = 0 to Wscript.Arguments.Count-1
  arg = Wscript.Arguments(I)

  ' ファイルかディレクトリかをチェック
  If Not fso.FileExists(arg) Then
    If Not fso.FolderExists(arg) Then
      str = arg & " is Error"
      Exit For
    End If

    Set f = fso.GetFolder(arg)
    pathname = f.Name
    str = pathname & " is Folder"
    Exit For
  End If

  ' ファイル情報を取得
  Set f = fso.GetFile(arg)

  ' ファイルパス
  filepath = f.Path
  ' ファイル名
  filename = f.Name

  ' 作成日付
'  datetime = f.DateCreated
  ' 更新日付
  datetime = f.DateLastModified
  ' ファイルサイズ
  sizeNum = f.Size

  ' 更新日付文字列整形、文字列置換
  datetime = Replace(datetime, "/", "-")
  datetime = Replace(datetime, ":", "-")
  datetime = Replace(datetime, " ", "_")

  ' サイズ数値 3桁区切り文字列変換
  sizeStr = FormatNumber(sizeNum, 0, -1, 0, -1)
  ' サイズ数値 3桁区切り無し文字列変換
'  sizeStr = FormatNumber(sizeNum, 0, -1, 0, 0)

  ' 文字列作成
'  str = str & filepath & "\"
'  str = str & filename & " "
  str = str & datetime & " "
  str = str & sizeStr

  ' 複数処理の場合は改行する
  str = str & vbCrLf

  Set f = Nothing

  ' 複数処理の場合は Exitを削除する
'  Exit For
Next
' Wscript.Echo str

Set fso = Nothing

' clip.exeで改行対応の文字列置換(不要)
' str = Replace(str, vbCrLf, vbNewLine)

' clip.exeでクリップボードに str文字列をコピー
Set WshShell = CreateObject("WScript.Shell")
WshShell.Exec("clip").StdIn.Write str
Set WshShell = Nothing


● Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法

●その1
 ファイルエクスプローラでファイルを右クリックした時のコンテキストメニューの「送る」の項目を編集する方法

 マイコンピュータを開いて「sendto」を入力すると「送る」メニューの設定フォルダにジャンプできます。

・Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法
Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法


・Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法
Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法


・Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法
Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法



●その2
 Windows + Rキーで「ファイル名を指定して実行」を表示。
 ファイル名を指定して実行で「shell:sendto」を入力して実行。

・Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法
Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法


・Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法
Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法


・Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法
Windows ファイルの右クリックの「送る」メニューの項目の場所に移動する方法




● WSH Windows Script Host プログラム解説

Set fso = CreateObject("Scripting.FileSystemObject")
 ファイルの情報を操作するオブジェクトを作成する

Wscript.Arguments.Count
 SendToで送られたファイルの数

Wscript.Arguments(n)
 SendToで送られたファイルのファイル名
 nは 0から始まる

If Not fso.FileExists(arg) Then
If Not fso.FolderExists(arg) Then
 ファイルかディレクトリかをチェック

File オブジェクト
Folder オブジェクト

fso.GetParentFolderName(arg)
 ファイルのパスを取得する
GetParentFolderName メソッド
 指定されたパスの最後のファイルまたはフォルダの親フォルダの名前が入った文字列を返します。

fso.GetFileName(arg)
 ファイル名を取得する
GetFileName メソッド
 指定されたパスの最後のファイル名またはフォルダ名を返します。

fso.GetFile(arg)
 ファイルの情報を取得
GetFile メソッド
 指定されたパスに置かれているファイルに対応する File オブジェクトを返します。

f.Path
 ファイルのパスを取得する(上記 GetParentFolderNameと同様)
f.Name
 ファイル名を取得する(上記 GetFileNameと同様)

f.DateCreated
 ファイルの作成日付
 今回は「ファイルの更新日付」が必要と言う事で’文字でコメント(無効)している

f.DateLastModified
 ファイルの更新日付

f.Size
 ファイルサイズ

datetime = Replace(datetime, "/", "-")
datetime = Replace(datetime, ":", "-")
datetime = Replace(datetime, " ", "_")
 更新日付文字列整形
 「yyyy-mm-dd_hh-mm-ss」の形式で欲しいと言う事で文字列置換している

Replace 関数
 指定された文字列の一部を、別の文字列で指定された回数分で置換した文字列を返します。

FormatNumber(sizeNum, 0, -1, 0, -1)
 ファイルサイズを 3桁区切りで欲しいと言う事で FormatNumber命令を使用している

FormatNumber(sizeNum, 0, -1, 0, 0)
 3桁区切り無しの場合は最後が 0

FormatNumber 関数
 数値形式の文字列に書式設定して返す文字列処理関数です。

FormatNumber(Expression [,NumDigitsAfterDecimal [,IncludeLeadingDigit [,UseParensForNegativeNumbers [,GroupDigits]]]])
引数
Expression必ず指定します。書式を変換する式を指定します。
NumDigitsAfterDecimal省略可能です。小数点以下に表示する桁数を表す数値を指定します。既定値は -1 で、[地域のプロパティ] の値を使用します。
IncludeLeadingDigit省略可能です。小数点の左側のゼロを表示するかどうかを表す定数を指定します。設定する値については、次の「設定値」を参照してください。
UseParensForNegativeNumbers省略可能です。負の値をかっこで囲むかどうかを表す定数を指定します。設定する値については、次の「設定値」を参照してください。
GroupDigits省略可能です。[コントロール パネル] で指定されている桁区切り記号を使用して、数値を区切るかどうかを表す定数を指定します。設定する値については、次の「設定値」を参照してください。

' str = str & vbCrLf
Exit For
 一度に複数のファイルの処理は不要と言う事で「複数処理」を無効かしている
 一度に複数のファイルの処理をする場合は「コメント」の内容に従って書き換える

WSH VBS 文字列の定数

str = Replace(str, vbCrLf, vbNewLine)
 clip.exeコマンドで改行をする為に vbNewLineに置換している(実際は不要)

Set WshShell = CreateObject("WScript.Shell")
 WScript.Shellオブジェクトを作成する

WshShell.Exec("clip").StdIn.Write str
 clip.exeコマンドを実行してクリップボードに str変数の文字列をコピーする
 (実行する一瞬、画面に実行ウィンドウが表示されます)
Exec メソッド
 子コマンドシェルでアプリケーションを実行します。アプリケーションから StdIn/StdOut/StdErr ストリームにアクセスできます。



● clip.exeコマンド

(Work) Tool of the day - ‘clip.exe’

> clip.exe /?

CLIP

説明:
    コマンド ライン ツールの出力を Windows クリップボードにリダイレクトします。
    その出力されたテキストをほかのプログラムに貼り付けることができます。

パラメーター一覧:
    /?                  このヘルプを表示します。

例:
    DIR | CLIP          現在のディレクトリ一覧のコピーを Windows クリップボード
                        に貼り付けます。

    CLIP < README.TXT   readme.txt ファイルのテキストのコピーを Windows
                        クリップボードに貼り付けます。


● WSHからクリップボードを操作する方法

 下記の外部ライブラリを使用して Windows APIを直接呼び出すらしい。

 ・DynamicWrapper
An Automation Object for Dynamic DLL Calls DynamicWrapper
 ・DynaCall
Born's Windows Scripting Host The DynaCall page
 ・SFC mini
SFC mini (ver 1.1)

 ・HTA HTML Applications
HTML Applications 概要 Microsoft Corporation



● UTF-8対応の追試、WSHや VBSで UTF-8でググると WSF Windows Script Fileが出てくる

 WSHや VBSでの UTF-8対応でググると WSF Windows Script Fileなら UTF-8対応だよ、と出てきましたので追試しました。

 結果は駄目でした。スクリプトファイル自体は UTF-8で書けて動きますが、引数の受け渡しが Shift JISのままでファイル名が文字化けしてファイルの処理で失敗します。

●検証結果:
arg = Wscript.Arguments(I)
 で「送る」からファイル名を受け取った時点で文字化けしていました。その為にファイル操作でエラーが発生して動きませんでした。
 WSFファイル内での UTF-8文字の処理は正しく行なわれました。

●結論:
 WSF内部では UTF-8を処理できるが、Wscript.Arguments()による引数の受け渡しは UTF-8に対応していない。

 UTF-8文字コードで保存する。BOMは有っても無くても大丈夫だった。
ファイル情報クリップボードコピー.wsf
<?xml version="1.0" encoding="utf-8" ?>
<package>
  <job>
    <runtime></runtime>
    <script language="VBScript">
    <![CDATA[

' Copyright (c)2018 FREE WING, Y.Sakamoto

Set fso = CreateObject("Scripting.FileSystemObject")

str = ""
For I = 0 to Wscript.Arguments.Count-1
  arg = Wscript.Arguments(I)

  ' ファイルかディレクトリかチェック
  If Not fso.FileExists(arg) Then
    If Not fso.FolderExists(arg) Then
      str = arg & " is Error"
      Exit For
    End If

    Set f = fso.GetFolder(arg)
    pathname = f.Name
    str = pathname & " is Folder"
    Exit For
  End If

  ' ファイル情報を取得
  Set f = fso.GetFile(arg)

  ' ファイルパス
  filepath = f.Path
  ' ファイル名
  filename = f.Name

  ' 作成日付
'  datetime = f.DateCreated
  ' 更新日付
  datetime = f.DateLastModified
  ' ファイルサイズ
  sizeNum = f.Size

  ' 更新日付文字列整形、文字列置換
  datetime = Replace(datetime, "/", "-")
  datetime = Replace(datetime, ":", "-")
  datetime = Replace(datetime, " ", "_")

  ' サイズ数値 3桁区切り文字列変換
  sizeStr = FormatNumber(sizeNum, 0, -1, 0, -1)
  ' サイズ数値 3桁区切り無し文字列変換
'  sizeStr = FormatNumber(sizeNum, 0, -1, 0, 0)

  ' 文字列作成
'  str = str & filepath & "\"
'  str = str & filename & " "
  str = str & datetime & " "
  str = str & sizeStr

  ' 複数処理の場合は改行する
  str = str & vbCrLf

  Set f = Nothing

  ' 複数処理の場合は Exitを削除する
'  Exit For
Next
' Wscript.Echo str

Set fso = Nothing

' clip.exeで改行対応の文字列置換(不要)
' str = Replace(str, vbCrLf, vbNewLine)

' clip.exeでクリップボードに str文字列をコピー
Set WshShell = CreateObject("WScript.Shell")
WshShell.Exec("clip").StdIn.Write str
Set WshShell = Nothing

    ]]>
    </script>
  </job>
</package>

 UTF-8対応検証その1、「あいう你好学习」を問題無く表示する。
<?xml version="1.0" encoding="utf-8" ?>
<package>
  <job>
    <runtime></runtime>
    <script language="VBScript">
    <![CDATA[

Wscript.Echo "あいう你好学习"

    ]]>
    </script>
  </job>
</package>

 UTF-8対応検証その2、"C:\hogehoge\あいう你好学习.txt"ファイルの情報を問題無く取得して表示する。
<?xml version="1.0" encoding="utf-8" ?>
<package>
  <job>
    <runtime></runtime>
    <script language="VBScript">
    <![CDATA[

  Set fso = CreateObject("Scripting.FileSystemObject")
  arg = "C:\hogehoge\あいう你好学习.txt"

  ' ファイル情報を取得
  Set f = fso.GetFile(arg)
  filepath = f.Path
  filename = f.Name
  datetime = f.DateLastModified
  sizeNum = f.Size

  datetime = Replace(datetime, "/", "-")
  datetime = Replace(datetime, ":", "-")
  datetime = Replace(datetime, " ", "_")

  sizeStr = FormatNumber(sizeNum, 0, -1, 0, -1)

  ' 文字列作成
  str = str & filepath & "\"
  str = str & filename & " "
  str = str & datetime & " "
  str = str & sizeStr

  Wscript.Echo str

    ]]>
    </script>
  </job>
</package>

 UTF-8対応検証その3、"C:\hogehoge\あいう你好学习.txt"ファイルを「送る」で実行すると、ファイル名が "C:\hogehoge\あいう?好学?.txt"に文字化けしている。
<?xml version="1.0" encoding="utf-8" ?>
<package>
  <job>
    <runtime></runtime>
    <script language="VBScript">
    <![CDATA[

  arg = Wscript.Arguments(0)
  Wscript.Echo arg

    ]]>
    </script>
  </job>
</package>


● WSFでの UTF-8ファイル名問題が解決しました!「鳴かぬなら 鳴かせてみせよう ホトトギス」

 WSFを使用して UTF-8対応の場合の問題点と不具合の原因がわかりました。

 問題の解決方法としては「送る」から UTF-8のファイル名を受け取り、それを文字化けしない状態で WSF側に渡せれば良い事になります。

 ならば、ファイル名を文字化けしない状態で受け渡ししてやろうじゃないか!

 と言う訳で、UTF-8のファイル名を変換処理する小さなプログラムを .NET C#で作成しました。

 1) 「送る」から C#の変換プログラムを実行する
 2) C#の変換プログラムで UTF-8の文字列を URLエンコードする
 3) URLエンコードした内容を WSFプログラムに受け渡す
 4) WSFプログラムは UTF-8のファイル名を処理できる
 5) 結果オーライでバッチグー!
 となり、一連のこの処理で問題無く UTF-8の文字コードのファイル名のファイル情報も WSF側で処理してクリップボードに情報をコピーできました。

 ライセンスは
 ・GNU General Public License v3.0
GNU General Public License v3.0

C#側プログラム(.NET 2.0 ~ .NET 4.7に対応しています)
 // .NET Framework 2.0 C#
 // 引数を URLEncodeして第一引数の Windows Scriptプログラムを実行する
 // Copyright (c)2018 FREE WING, Y.Sakamoto
using System.Web;
using System.Diagnostics;

namespace UrlEncode20Con
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "";
            bool isFirst = true;
            foreach (string arg in args)
            {
                string argTmp = "";

                // 最初の引数は実行コマンドなので UrlEncodeで変換しない
                if (isFirst)
                {
                    isFirst = false;
                    argTmp = arg;
                }
                else
                {
                    // UrlEncodeで変換する(+文字は %2b、半角空白は +文字)
                    argTmp = HttpUtility.UrlEncode(arg);

                    // EscapeDataStringで変換する(上記文字の扱いが .NET 4.0以前と 4.5以降で異なる)
                    // argTmp = Uri.EscapeDataString(arg);
                }

                // 最初の引数は実行コマンドなので UrlEncodeで変換しない
                if (isFirst)
                {
                    isFirst = false;
                    argTmp = arg;
                }
                else
                {
                    // UrlEncodeで変換する(+文字は %2b、半角空白は +文字)
                    argTmp = HttpUtility.UrlEncode(arg);

                    // EscapeDataStringで変換する(上記文字の扱いが .NET 4.0以前と 4.5以降で異なる)
                    // argTmp = Uri.EscapeDataString(arg);
                }
            // 確認用に表示する
            // Console.WriteLine(str);

            // 確認用に一時停止する
            // using System.Threading;
            // Thread.Sleep(3000);

            // str文字列のコマンドを実行する
            ProcessStartInfo ps = new ProcessStartInfo();
            ps.FileName = "WScript.exe";
            ps.Arguments = str;
            Process.Start(ps);
        }
    }
}
 URLエンコード処理に HttpUtility.UrlEncodeを使用しています。

 ・UrlEncode20Con.exeのショートカットを SendToフォルダに作成します。
 ・UrlEncode20Con.exeのショートカットを右クリックして「プロパティ」を開く
 ・リンク先の欄の後ろに 「ファイル情報クリップボードコピー.wsf」の「ファイルパス」を足す。
  これで、UrlEncode20Con.exeプログラムの第一引数に WSFプログラムを指定します。
  例:C:\Hoge\UrlEncode20Con.exe C:\Hoge\ファイル情報クリップボードコピー.wsf

 URLデコード処理に対応した ファイル情報クリップボードコピー.wsf プログラム

 URLデコード処理は下記の内容を使用しました。
Decoding URL encoded UTF-8 strings in VBScript

ファイル情報クリップボードコピー.wsf
<?xml version="1.0" encoding="utf-8" ?>
<package>
  <job>
    <runtime></runtime>
    <script language="VBScript">
    <![CDATA[

' Copyright (c)2018 FREE WING, Y.Sakamoto

' WScript.Echo URLDecode("Paris%20%E2%86%92%20Z%C3%BCrich")

Set fso = CreateObject("Scripting.FileSystemObject")

str = ""
For I = 0 to Wscript.Arguments.Count-1
  arg = Wscript.Arguments(I)
'  WScript.Echo arg
  ' +文字を半角空白に置換する
  arg = Replace(arg, "+", " ")
  ' 引数の文字列を URLDecodeする
  arg = URLDecode(arg)
'  WScript.Echo arg

  ' ファイルかディレクトリかチェック
  If Not fso.FileExists(arg) Then
    If Not fso.FolderExists(arg) Then
      str = arg & " is Error"
      Exit For
    End If

    Set f = fso.GetFolder(arg)
    pathname = f.Name
    str = pathname & " is Folder"
    Exit For
  End If

  ' ファイル情報を取得
  Set f = fso.GetFile(arg)

  ' ファイルパス
  filepath = f.Path
  ' ファイル名
  filename = f.Name

  ' 作成日付
'  datetime = f.DateCreated
  ' 更新日付
  datetime = f.DateLastModified
  ' ファイルサイズ
  sizeNum = f.Size

  ' 更新日付文字列整形、文字列置換
  datetime = Replace(datetime, "/", "-")
  datetime = Replace(datetime, ":", "-")
  datetime = Replace(datetime, " ", "_")

  ' サイズ数値 3桁区切り文字列変換
  sizeStr = FormatNumber(sizeNum, 0, -1, 0, -1)
  ' サイズ数値 3桁区切り無し文字列変換
'  sizeStr = FormatNumber(sizeNum, 0, -1, 0, 0)

  ' 文字列作成
'  str = str & filepath & "\"
'  str = str & filename & " "
  str = str & datetime & " "
  str = str & sizeStr

  ' 複数処理の場合は改行する
  str = str & vbCrLf

  Set f = Nothing

  ' 複数処理の場合は Exitを削除する
'  Exit For
Next
' Wscript.Echo str

Set fso = Nothing

' clip.exeで改行対応の文字列置換(不要)
' str = Replace(str, vbCrLf, vbNewLine)

' clip.exeでクリップボードに str文字列をコピー
Set WshShell = CreateObject("WScript.Shell")
WshShell.Exec("clip").StdIn.Write str
Set WshShell = Nothing

' Decoding URL encoded UTF-8 strings in VBScript
' https://stackoverflow.com/questions/17880395/decoding-url-encoded-utf-8-strings-in-vbscript
Function URLDecode(str)
    set list = CreateObject("System.Collections.ArrayList")
    strLen = Len(str)
    for i = 1 to strLen
        sT = mid(str, i, 1)
        if sT = "%" then
            if i + 2 <= strLen then
                list.Add cbyte("&H" & mid(str, i + 1, 2))
                i = i + 2
            end if
        else
            list.Add asc(sT)
        end if
    next
    depth = 0
    for each by in list.ToArray()
        if by and &h80 then
            if (by and &h40) = 0 then
                if depth = 0 then Err.Raise 5
                val = val * 2 ^ 6 + (by and &h3f)
                depth = depth - 1
                if depth = 0 then
                    sR = sR & chrw(val)
                    val = 0
                end if
            elseif (by and &h20) = 0 then
                if depth > 0 then Err.Raise 5
                val = by and &h1f
                depth = 1
            elseif (by and &h10) = 0 then
                if depth > 0 then Err.Raise 5
                val = by and &h0f
                depth = 2
            else
                Err.Raise 5
            end if
        else
            if depth > 0 then Err.Raise 5
            sR = sR & chrw(by)
        end if
    next
    if depth > 0 then Err.Raise 5
    URLDecode = sR
End Function

    ]]>
    </script>
  </job>
</package>


●もう C#でプログラムしちゃってるから全部 C#にしちゃうおうか?

 「YOU!作っちゃいなよ!」と言う事で C#で最後まで作りました。

 UTF-8のファイル名に対応で、これ単体で目的を達成できます。
 ソースコードも下記にあるので、C#命令が分かれば改造も自由自在です。
 (著作権は放棄していません)

 ライセンスは
 ・GNU General Public License v3.0
GNU General Public License v3.0

 Microsoft Visual Studioでコンパイルできます。
 Visual Studio Communityは無料。
Visual Studio 2017 ダウンロード

ClipFileInfo.cs
 // .NET Framework 2.0 C#
 // ClipFileInfo.exeを「送る」にコピーする。
 // 使い方は http://www.neko.ne.jp/~freewing/software/sendto_file_info_copy_clipboard_wsh/
 // Copyright (c)2018 FREE WING, Y.Sakamoto
using System;
using System.IO;
using System.Windows.Forms;

namespace ClipFileInfo
{
    class Program
    {
        // Single Thread Apartment (STA) モード
        // STAThreadAttribute
        [STAThread]
        static void Main(string[] args)
        {
            string str = "";
            foreach (string arg in args)
            {
                string path = arg;

                try
                {
                    FileAttributes attributes = File.GetAttributes(path);
                    if ((attributes & FileAttributes.Directory) == FileAttributes.Directory)
                    {
                        continue;
                    }
                }
                catch (Exception)
                {
                    continue;
                }

                string fileName = Path.GetFileName(path);
                string directoryName = Path.GetDirectoryName(path);
                DateTime lastWriteTime = File.GetLastWriteTime(path);

                long fileSize = new FileInfo(path).Length;

                // string dateStr = lastWriteTime.ToString("yyyy/MM/dd HH:mm:ss");
                string lastWriteTimeStr = lastWriteTime.ToString("yyyy-MM-dd_HH-mm-ss");
                string fileSizeStr = string.Format("{0:N0}", fileSize);

                str += directoryName;
                str += " ";
                str += fileName;
                str += " ";
                str += lastWriteTimeStr;
                str += " ";
                str += fileSizeStr;
                str += System.Environment.NewLine;
            }

            // 確認用に表示する
            // Console.WriteLine(str);

            // 確認用に一時停止する
            // using System.Threading;
            // System.Threading.Thread.Sleep(3000);

            if (str.Length > 0)
            {
                Clipboard.Clear();
                Clipboard.SetData(DataFormats.UnicodeText, str);
                // Clipboard.SetDataObject(str, true);
            }
        }
    }
}


●ファイルの右クリックのコンテキストメニューのメニュー項目として登録する場合

 下記の内容のレジストリファイル ClipFileInfo.regを作成して登録します。

ClipFileInfo.reg
[HKEY_CLASSES_ROOT\*\shell\ClipFileInfo]
@="ファイル情報コピー"

[HKEY_CLASSES_ROOT\*\shell\ClipFileInfo\command]
@="C:\\hoge\\ClipFileInfo.exe \"%1\""

; wsfファイルの場合
; @="WScript.exe \"C:\\hoge\\ファイル情報クリップボードコピー.wsf\" \"%1\""



Tags: [Windowsアプリ]



[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2018 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/software/sendto_file_info_copy_clipboard_wsh/