Word添付ファイルの編集についてNo.10832
じゅげむ さん 23/01/18 11:30
 
 いつもお世話になっております。
 従前、秀丸メールで受信したWordの添付ファイルについては、他の添付ファイルと
同様、読み取り専用で開くものの、編集した上で別名保存することが可能でした。
ところが、最近、添付ファイルのままwordファイルを開くと「編集するアクセス許可
がありません」という表示が出て、先にどこかに保存しないと編集できない状態にな
っています。(試みにwordのトラストセンターの信頼できる場所に、秀丸メールの添
付ファイルが保存されるフォルダを指定してみましたが、変わりません。)

 最近変えたことといえば、Microsoft 365 のword(サブスクリプション版)を使う
ようになったことくらいです。

 ちなみに、同じメールをOutlookで受信すると、添付ファイルをそのまま編集する
ことが可能(もちろん編集後は別名保存が必要ですが)です。

 この現象はwordファイルに限ったことであり、エクセルファイルでは従前どおり編
集が可能です。

 Outlookに囲い込みたいWord側の問題なのだろうと推測していますが、メールソフ
ト側の添付ファイルに対する読取専用処理のどこかをいじることで、編集可能にでき
ないものかと思い、おたずねします。

じゅげむ

[ ]
RE:10832 Word添付ファイルの編集についてNo.10833
秀まるお2 さん 23/01/18 12:01
 
 ファイルの読み取り専用属性については、「全般的な設定・上級者向け・デコー
ド・添付ファイル」の所にある

    □ 受信した添付ファイルを上書き禁止属性にする

 のオプションをOFFにすればいいです。それでいきなり編集できるようになると思
います。
 (今後受信するメールから)

 それとは別に、「ZoneID」って仕組みがあって、それのせいで編集できなくなって
るのかもしれません。ZoneIDを付けるか付けないかは以前の秀丸メールにはオプショ
ンがあったんですが、今現在の秀丸メールではオプションは廃止されて常に「ZoneID
付き」固定になります。これはセキュリティ的な理由によります。

 ZoneIDについてはネット検索する他に、「デコード・添付ファイル」のヘルプペー
ジに説明があるのでそれも参考にしてほしいです。

 ZoneIDのせいで編集できないとしたら、解決策としては、添付ファイルアイコンの
マウス右ボタンメニューから「プロパティ」を実行するか、または「Alt+Enter」
キーを押してプロパティを呼び出して、「全般」ページの下の方にある


   セキュリティ:  このファイルは他のコンピュータから取得したものです。
                   ・・・・・・・・・・・・・・・・・・・・・
                   ・・・・・・・・・・・・・・・・・・・・・


 の右側にある「許可する」をONにしてOKする操作が必要になります。

>  最近変えたことといえば、Microsoft 365 のword(サブスクリプション版)を使
>うようになったことくらいです。

 世の中全体的にセキュリティが厳しくなってる方向でして、Wordの方でも何かこの
辺厳しめに仕様変更されたりしてるのかもしれません。

 近年特に問題になってる「Emotet」って種類の悪質マルウェアがありまして、これ
はほとんの場合、Word/Excelファイルになってばらまかれています。これへの対策の
関係で厳しくなったんじゃないかという気がします。

[ ]
RE:10833 Word添付ファイルの編集についてNo.10836
じゅげむ さん 23/01/18 16:19
 
ありがとうございます。

確かに、「全般的な設定・上級者向け・デコード・添付ファイル」の所にある
□ 受信した添付ファイルを上書き禁止属性にする
のオプションをOFFにすれば、編集できました。

しかし、そうすると、うっかりの上書保存を避けられないのでなかなか悩ましいです
ね。編集するときだけ、添付ファイルのプロパティから読取り専用属性を外すことも
選択肢の1つかなと思案しています。

いろいろ試してみると、microsoft365の場合、読み取り専用にしたwordファイルは、
読み取り専用属性を外さない限り、編集できないようになってしまっているようでし
た。ローカルのテンプレ用ファイルなどでも同じ現象が生じています。

どうやら以下の問題なのかなと推測されます。
https://answers.microsoft.com/ja-jp/msoffice/forum/all/word%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%81%93/4e0e5de6-1f29-4cb9-ba8f-92c9e66c5924

ただ、Outlook上では、例外的に、編集可能な特殊な読み取り専用属性で開くので、
バグではなく、意図的にそうしているのではないかと疑われるところです。

[ ]
RE:10836 Word添付ファイルの編集についてNo.10837
秀まるお2 さん 23/01/18 18:52
 
 そのようなやりとりがあったということで、参考情報ありがとうございます。

 Windows10/11の「フィードバックHub」ってアプリにて問題として報告すると、も
しかしたら対応してくれる可能性はあるかなぁと思います。

 秀丸メールでなんとかするとしたら、添付ファイルを選択してAlt+Enterキーを押
してからAlt+Rキーで上書き禁止属性を切り替えてOKし、それから開くとかって手順
になりますが、しいてそのような操作を一発で実行するようなマクロを作成して対応
なら可能かと思います。もし必要でしたらマクロのサンプルを作成してお返事可能で
す。

[ ]
RE:10837 Word添付ファイルの編集についてNo.10839
じゅげむ さん 23/01/18 20:59
 
複数のPCで同一環境(OSのバージョンとOfficeのバージョンを最新に、Officeの設定
を同じにそろえた)でテストしたところ、1つのPCでは、読取り専用のまま編集でき、
もう1つのPCでは、読取り専用のままでは編集できないという現象が生じており、お
手上げです。

ご提案の添付ファイル用マクロを作っていただけると大変にありがたいです。
よろしくお願いします。

[ ]
RE:10839 Word添付ファイルの編集についてNo.10844
秀まるお2 さん 23/01/19 10:21
 
 Microsoft Officeについはなぜだか分かりませんが、とりあえずマクロは作ってみ
ました。

 添付ファイルが複数ある場合は、どれを開くのかのメニューが出てきます。1つだ
けの場合は即座に開きます。


// 添付ファイルを編集用に開く.mac
//
    loaddll "tkinfo.dll";
    #count = dllfunc("CountCurrentHeader", "X-Attach");
    #index = 0;
    if( #count == 0 ) {
        message "添付ファイルはありません。";
        endmacro;
    }
    if( #count > 1 ) {
        #i = 0;
        $menu[0] = "編集する添付ファイルを選択してください。選択されたファイ
ルの読み取り専用属性はOFFになります。";
        $menu[1] = "\x01";
        while( #i < #count ) {
            $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
            $attach = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
            $menu[2 + #i] = $attach;
            #i = #i + 1;
        }
        menuarray $menu, #count + 2;
        if( result <= 2 ) {
            endmacro;
        }
        #index = result - 3;
    } else {
        //question "添付ファイルの読み取り専用属性をOFFにして開いてもいいで
すか?";
        //if( result != yes ) {
        //    endmacro;
        //}
    }
    $attach = dllfuncstr("CurrentHeader2", "X-Attach", #index);
    $path = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount") + "\\" + $a
ttach;
    #attr = dllfunc("Bypass_GetFileAttributes", $path);
    if( (#attr & 1) != 0 ) {
        #n = dllfunc("Bypass_SetFileAttributes", $path, #attr & 0xFFFE);
    }
    openbyshell $path;

----------------------------------------------------------------------------
-----------------

 こちらはデスクトップに一時ファイルを生成してそれを開く方式のマクロです。昔
似たような問い合わせがあった時に作った物です。

----------------------------------------------------------------------------
-----------------
// 添付ファイルを編集用に開く-デスクトップ一時ファイル版.mac
//
    loaddll "tkinfo.dll";
    #count = dllfunc("CountCurrentHeader", "X-Attach");
    #index = 0;
    if( #count == 0 ) {
        message "添付ファイルはありません。";
        endmacro;
    }
    if( #count > 1 ) {
        #i = 0;
        $menu[0] = "編集する添付ファイルを選択してください。";
        $menu[1] = "\x01";
        while( #i < #count ) {
            $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
            $attach = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
            $menu[2 + #i] = $attach;
            #i = #i + 1;
        }
        menuarray $menu, #count + 2;
        if( result <= 2 ) {
            endmacro;
        }
        #index = result - 3;
    }
    $attach = dllfuncstr("CurrentHeader2", "X-Attach", #index);
    $attachbase = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
    $path = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount") + "\\" + $a
ttach;

    $desktop = getenv("USERPROFILE") + "\\Desktop";
    if( !existfile($desktop) ) {
        message "デスクトップフォルダが特定できませんでした。";
        endmacro;
    }
    $destdir = $desktop;
    $destpath = $destdir + "\\" + $attachbase;
    #n = dllfunc("Bypass_CopyFile", $path, $destpath, 1);
    if( #n == 0 ) {
        message "添付ファイルをデスクトップの一時編集用フォルダにコピーする
のが失敗しました。";
        endmacro;
    }
    #attr = dllfunc("Bypass_GetFileAttributes", $destpath);
    if( (#attr & 1) != 0 ) {
        #n = dllfunc("Bypass_SetFileAttributes", $destpath, #attr & 0xFFFE);
    }
    openbyshell $destpath;
    if( result != yes ) {
        message "添付ファイルをデスクトップの一時編集用フォルダに保存しまし
たが、ファイルを開くことに失敗しました。";
        endmacro;
    }
    question "ファイルを開きました。編集が終わったら、\n「はい」を押すと編集
したファイルに置き換え動作。\n「いいえ」を押すと置き換えなし。";
    if( result == yes ) {
        #n = dllfunc("Bypass_SetFileAttributes", $path, #attr & 0xFFFE);
        #n = dllfunc("Bypass_CopyFile", $destpath, $path, 0);
        if( #n == 0 ) {
            message "添付ファイルをデスクトップの一時編集用フォルダから戻す
用のコピーに失敗しました。";
            endmacro;
        }
        #n = dllfunc("Bypass_DeleteFile", $destpath);
        message "編集した添付ファイルで置き換えました。";
    } else {
        message "添付ファイルは置き換えしません。デスクトップ上のファイルは
手作業で削除してください。";
    }


[ ]
RE:10844 Word添付ファイルの編集についてNo.10846
じゅげむ さん 23/01/19 11:36
 
ありがとうございます。
2つ目のマクロの方がリスクがないので2つ目を使わせていただきます。
想定通りの動きで、助かります。
欲を言うと、2つお願いがあります。

問題が生じているのはwordファイルだけなので、拡張子がdocxかdocのファイルが1つ
しかない場合には、リストを出さず即時当該wordファイルを開けないでしょうか。

また実行後、添付ファイルを置き換えるかどうかのダイアログで、デフォルトでは、
はいにフォーカスされていますが、うっかり置き換えるリスクがあるので、デフォル
トは、いいえにしていただけると安心です。

さらに欲を言うと、マクロ終了時に一時ファイルが更新されていない場合には自動的
に削除されると、一時ファイルが増えすぎなくてよいかなとも思います。

よろしくお願いします。

じゅげむ

[ ]
RE:10846 Word添付ファイルの編集についてNo.10852
秀まるお2 さん 23/01/19 15:07
 
 Wordファイルじゃない場合の動作がいまいち不明なんですが、とりあえず以下のよ
うにしてみました。こんなんでどうでしょうか。

 Wordファイルが無い場合にどうしたらいいかとか、細かく指摘していただければま
た修正できると思います。

---------------------------------------------------------------------
// 添付ファイルを編集用に開く.mac
//
    loaddll "tkinfo.dll";
    #cAttach = dllfunc("CountCurrentHeader", "X-Attach");
    if( #cAttach == 0 ) {
        message "添付ファイルはありません。";
        endmacro;
    }
    #cAttachDoc = 0;
    #i = 0;
    while( #i < #cAttach ) {
        $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
        if( rightstr( $attach, 4 ) == ".doc"
         || rightstr( $attach, 5 ) == ".docx"
         || rightstr( $attach, 5 ) == ".docm"
          ) {
            //Wordファイル発見
            $attach[#cAttachDoc] = $attach;
            #cAttachDoc = #cAttachDoc + 1;
            message "#cAttachDoc = " + str(#cAttachDoc);
        }
        #i = #i + 1;
    }
    if( #cAttachDoc == 0 ) {
        //普通にファイルを開く?
        #i = 0;
        if( #cAttach > 1 ) {
            #i = 0;
            $menu[0] = "編集する添付ファイルを選択してください。";
            $menu[1] = "\x01";
            while( #i < #cAttach ) {
                $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                $attach = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
                $menu[2 + #i] = $attach;
                #i = #i + 1;
            }
            menuarray $menu, #cAttach + 2;
            if( result <= 2 ) {
                endmacro;
            }
            #i = result - 3;
        }
        $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
    } else if( #cAttachDoc == 1 ) {
        //Word添付ファイルが1つだけならそれを開く。
        $attach = $attach[0];
    } else {
        //選択?
        $menu[0] = "編集する添付ファイルを選択してください。";
        $menu[1] = "\x01";
        #i = 0;
        while( #i < #cAttachDoc ) {
            $menu[2 + #i] = midstr( $attach[#i], strrstr( $attach[#i], "\\"
 ) + 1 );
            #i = #i + 1;
        }
        menuarray $menu, #cAttachDoc + 2;
        if( result <= 2 ) {
            endmacro;
        }
        #i = result - 3;
        $attach = $attach[#i];
    }
    $attachbase = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
    $path = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount") + "\\" + $a
ttach;

    $desktop = getenv("USERPROFILE") + "\\Desktop";
    if( !existfile($desktop) ) {
        message "デスクトップフォルダが特定できませんでした。";
        endmacro;
    }
    $destdir = $desktop;
    $destpath = $destdir + "\\" + $attachbase;
    #n = dllfunc("Bypass_CopyFile", $path, $destpath, 1);
    if( #n == 0 ) {
        message "添付ファイルをデスクトップの一時編集用フォルダにコピーする
のが失敗しました。";
        endmacro;
    }
    #attr = dllfunc("Bypass_GetFileAttributes", $destpath);
    if( (#attr & 1) != 0 ) {
        #n = dllfunc("Bypass_SetFileAttributes", $destpath, #attr & 0xFFFE);
    }
    //ファイルの更新日時を比較する
    #fso = createobject("Scripting.FileSystemObject");
    #fo = member(#fso, "GetFile", $destpath);
    $datePrev = member(#fo, "DateLastModified");
    message $datePrev;

    openbyshell $destpath;
    if( result != yes ) {
        message "添付ファイルをデスクトップの一時編集用フォルダに保存しまし
たが、ファイルを開くことに失敗しました。";
        endmacro;
    }
    #ret = dllfunc("Bypass_MessageBox", hidemaruhandle(0), "ファイルを開きま
した。編集が終わったら、\n「はい」を押すと編集したファイルに置き換え動作。\n
「いいえ」を押すと置き換えなし。", "添付ファイルを編集用に開くマクロ", 0x20
+ 3 + 0x100);
    $dateNew = member(#fo, "DateLastModified");
    if( $dateNew != "" && $dateNew == $datePrev ) {
        question "添付ファイルは更新されていません。デスクトップ上の一時ファ
イルを削除していいですか?";
        if( result == yes ) {
            #n = dllfunc("Bypass_DeleteFile", $destpath);
        }
        endmacro;
    }
    if( #ret == 6 ) {       //「はい」ボタンを押した場合
        #n = dllfunc("Bypass_SetFileAttributes", $path, #attr & 0xFFFE);
        #n = dllfunc("Bypass_CopyFile", $destpath, $path, 0);
        if( #n == 0 ) {
            message "添付ファイルをデスクトップの一時編集用フォルダから戻す
用のコピーに失敗しました。";
            endmacro;
        }
        #n = dllfunc("Bypass_DeleteFile", $destpath);
        message "編集した添付ファイルで置き換えました。";
    } else {
        question "デスクトップ上の一時ファイルを削除していいですか?";
        if( result == yes ) {
            #n = dllfunc("Bypass_DeleteFile", $destpath);
        }
        endmacro;
    }

[ ]
RE:10852 Word添付ファイルの編集についてNo.10853
じゅげむ さん 23/01/19 17:22
 
早速ありがとうございます。
message "#cAttachDoc = " + str(#cAttachDoc);

message $datePrev;
は実際の動作には不要かなと思い削除してみましたが、必要でしょうか。

あと、せっかくここまで作り込んでいただいて恐縮ですが、添付ファイルを置き換え
ることは基本的には想定していないので、一時ファイル作成時のタイムスタンプと、
一時ファイルを閉じる時点のタイムスタンプを比較し、タイムスタンプに変更がなけ
れば一時ファイルを削除し、変更があればそのまま残すということさえできれば良い
かなと思うのですが、いかがでしょうか。

(添付ファイルを置き換えるような異例の場合には、手作業でファイルの読取り専用
をはずして作業すれば足りると思っており、このマクロ内での添付ファイル置き換え
オプションは不要です。)

じゅげむ


[ ]
RE:10853 Word添付ファイルの編集についてNo.10854
秀まるお2 さん 23/01/19 18:53
 
 message文は、すみませんが動作確認用に入れてたのを削除するの忘れてました。

 あと、デスクトップに保存したファイルを編集しても、元の添付ファイルを置き換
えることはしないってことで、マクロを改良してみました。まだいまいちかもしれな
いですけども、Bypass_MessageBoxのパラメータをいじればいいかもしれません。
(パラメータについてはヘルプ参照ください)

----------------------------------------------------------------
// 添付ファイルを編集用に開く.mac
//
    loaddll "tkinfo.dll";
    #cAttach = dllfunc("CountCurrentHeader", "X-Attach");
    if( #cAttach == 0 ) {
        message "添付ファイルはありません。";
        endmacro;
    }
    #cAttachDoc = 0;
    #i = 0;
    while( #i < #cAttach ) {
        $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
        if( rightstr( $attach, 4 ) == ".doc"
         || rightstr( $attach, 5 ) == ".docx"
         || rightstr( $attach, 5 ) == ".docm"
          ) {
            //Wordファイル発見
            $attach[#cAttachDoc] = $attach;
            #cAttachDoc = #cAttachDoc + 1;
        }
        #i = #i + 1;
    }
    if( #cAttachDoc == 0 ) {
        //普通にファイルを開く?
        #i = 0;
        if( #cAttach > 1 ) {
            #i = 0;
            $menu[0] = "編集する添付ファイルを選択してください。";
            $menu[1] = "\x01";
            while( #i < #cAttach ) {
                $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
                $attach = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
                $menu[2 + #i] = $attach;
                #i = #i + 1;
            }
            menuarray $menu, #cAttach + 2;
            if( result <= 2 ) {
                endmacro;
            }
            #i = result - 3;
        }
        $attach = dllfuncstr("CurrentHeader2", "X-Attach", #i);
    } else if( #cAttachDoc == 1 ) {
        //Word添付ファイルが1つだけならそれを開く。
        $attach = $attach[0];
    } else {
        //選択?
        $menu[0] = "編集する添付ファイルを選択してください。";
        $menu[1] = "\x01";
        #i = 0;
        while( #i < #cAttachDoc ) {
            $menu[2 + #i] = midstr( $attach[#i], strrstr( $attach[#i], "\\"
 ) + 1 );
            #i = #i + 1;
        }
        menuarray $menu, #cAttachDoc + 2;
        if( result <= 2 ) {
            endmacro;
        }
        #i = result - 3;
        $attach = $attach[#i];
    }
    $attachbase = midstr( $attach, strrstr( $attach, "\\" ) + 1 );
    $path = dllfuncstr("HomeDir") + dllfuncstr("CurrentAccount") + "\\" + $a
ttach;

    $desktop = getenv("USERPROFILE") + "\\Desktop";
    if( !existfile($desktop) ) {
        message "デスクトップフォルダが特定できませんでした。";
        endmacro;
    }
    $destdir = $desktop;
    $destpath = $destdir + "\\" + $attachbase;
    #n = dllfunc("Bypass_CopyFile", $path, $destpath, 1);
    if( #n == 0 ) {
        message "添付ファイルをデスクトップの一時編集用フォルダにコピーする
のが失敗しました。";
        endmacro;
    }
    #attr = dllfunc("Bypass_GetFileAttributes", $destpath);
    if( (#attr & 1) != 0 ) {
        #n = dllfunc("Bypass_SetFileAttributes", $destpath, #attr & 0xFFFE);
    }
    //ファイルの更新日時を比較する
    #fso = createobject("Scripting.FileSystemObject");
    #fo = member(#fso, "GetFile", $destpath);
    $datePrev = member(#fo, "DateLastModified");

    openbyshell $destpath;
    if( result != yes ) {
        message "添付ファイルをデスクトップの一時編集用フォルダに保存しまし
たが、ファイルを開くことに失敗しました。";
        endmacro;
    }
    message "ファイルを開きました。編集が終わったらOKボタンを押してください。";
    $dateNew = member(#fo, "DateLastModified");
    if( $dateNew != "" && $dateNew == $datePrev ) {
        #ret = dllfunc("Bypass_MessageBox", hidemaruhandle(0)
                , "添付ファイルは更新されていません。デスクトップ上の一時フ
ァイルを削除していいですか?"
                , "添付ファイルを開くマクロ"
                , 0x20      //質問アイコン
                 + 3        //はい、いいえ、キャンセル
                 + 0x100    //デフォルトボタン=2つ目=いいえ
                 );
        if( #ret == 6 /*「はい」ボタン*/ ) {
            #n = dllfunc("Bypass_DeleteFile", $destpath);
        }
        endmacro;
    }

[ ]
RE:10854 Word添付ファイルの編集についてNo.10855
じゅげむ さん 23/01/19 19:47
 
ありがとうございます。
意図したとおりです。
ただ、複数ファイルから選択したときは、一時ファイルの削除ができないようでした。

じゅげむ

[ ]
RE:10855 Word添付ファイルの編集についてNo.10857
秀まるお2 さん 23/01/20 10:01
 
> ただ、複数ファイルから選択したときは、一時ファイルの削除ができないようでし
>た。

 一応、こちらで簡単にテストした限りは複数ファイルから選択した場合(1つの
メールに複数のWordファイルが添付されてて、その中の1つを選択した場合)でも大
丈夫そうではありました。マクロの処理的にも間違ってないような気がします。

 Bypass_DeleteFileする所を以下のように修正してもらうと、ファイル名とエラー
コードが表示されて原因が分かるかもしれません。

        if( #ret == 6 /*「はい」ボタン*/ ) {
            #n = dllfunc("Bypass_DeleteFile", $destpath);
            if( #n == 0 ) {
                #error = dllfunc("Bypass_GetLastError");
                message "ファイル削除に失敗しました。\n" +
                        "ファイル名 = " + $destpath + "\n" +
                        "エラーコード = " + str(#error);
            }
        }

 あるいは、もしかしてファイルを更新しない場合に出るはずのメッセージが出ない
としたら、

    $dateNew = member(#fo, "DateLastModified");

 の直後に

 message $datePrev + "\n" + $dateNew;

 を入れて更新日時がちゃんと取得できてるかどうか確認すると何か分かるかもしれ
ません。

 ちょっと現段階では原因が分からないです。

[ ]
RE:10857 Word添付ファイルの編集についてNo.10861
じゅげむ さん 23/01/20 21:23
 
 いろいろいじっていると、複数ファイルかどうかの問題ではないことがわかりまし
た。
 一時ファイルの保存先フォルダをOneDriveと同期させていたため、同期のタイミン
グとファイル削除のタイミングが重なると、ファイルが使用中になっていて削除でき
なかったのではないかと推測します。
 いろいろありがとうございました。

じゅげむ

[ ]
RE:10861 Word添付ファイルの編集についてNo.10869
秀まるお2 さん 23/01/23 09:25
 
 OneDriveが同期してるといろいろ不都合が起きるようで、回避のためには別の所に
保存するか、またはOneDriveの同期からデスクトップを外すしか無いと思います。

 他のフォルダを指定するなら、例えばC:ドライブのルートに「temp」とかフォルダ
を作った上で、マクロの

    $destdir = $desktop;

 の所を

    $destdir = "C:\\temp";

 のように書き換えればいいと思います。

[ ]