iT邦幫忙

0

請問對一個檔案按右鍵選列印的BAT要怎麼寫

  • 分享至 

  • xImage

我要針對一個檔案點選右鍵然後按列印
想要寫一個BAT來執行這個動作
請問語法要怎麼寫,或是除了BAT外能用什麼程式來寫

ccutmis iT邦高手 2 級 ‧ 2021-01-28 12:14:25 檢舉
可以用Python寫
如果不熟Python的話 可以試試 Autoit
你要按右鍵出現系統選單點列印的檔是什麼檔?如果是一般文字檔、word/ excel/ppt/jpg這些有關連的應用程式列印的檔案?還是你自己定義的檔案?
批次檔我寫不出來,但用C#的話,不麻煩
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

6
japhenchen
iT邦超人 1 級 ‧ 2021-01-28 15:09:03

我不會用批次檔做這種事,恕我太笨

但如果你肯學C#,可以參考我寫的例子
在編譯出來的EXE檔上滑鼠右鍵→以系統管理員權限執行,即可在任何一個檔案上按滑鼠右鍵,出現的系統選單裡就會有【送到印表機】(這是我寫的標題啦)

using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;

namespace 新增選單項目
{
    class Program
    {
        private const string MenuName = "*\\shell\\MyPrint";
        private const string Command = "*\\shell\\MyPrint\\command";
        static void Main(string[] args)
        {
            if (!args.Any())
            {
                建立系統右鍵選單();
            }
            else
            {
                if (args.Contains("-p"))
                {
                    var 要印的檔案 = args.Last();
                    Console.WriteLine($"請按任一鍵開始列印{要印的檔案}");
                    Console.ReadKey();
                    // 寫點什麼讓程式列印吧,下面那一段行是動用系統關聯列印
                    ProcessStartInfo info = new ProcessStartInfo(要印的檔案);
                    info.Verb = "Print";
                    info.CreateNoWindow = true;
                    info.WindowStyle = ProcessWindowStyle.Hidden;
                    Process.Start(info);
                }
            }
        }

        private static void 建立系統右鍵選單()
        {
            RegistryKey regmenu = null;
            RegistryKey regcmd = null;
            string exe = Assembly.GetExecutingAssembly().Location;
            try
            {
                regmenu = Registry.ClassesRoot.CreateSubKey(MenuName);
                if (regmenu != null)
                    regmenu.SetValue("", "送到印表機");
                regcmd = Registry.ClassesRoot.CreateSubKey(Command);
                if (regcmd != null)
                    regcmd.SetValue("", $"\"{exe}\" -p \"%1\"");
            }
            catch (Exception ex)
            {
                Console.WriteLine( ex.Message);
                Console.ReadKey();
            }
            finally
            {
                if (regmenu != null)
                    regmenu.Close();
                if (regcmd != null)
                    regcmd.Close();
            }

        }
    }
}

https://ithelp.ithome.com.tw/upload/images/20210128/20117954w8jv5ZiSL5.jpg

我自己是寫了很多這類的應用,像多PDF合併列印,加浮水印列印、傳送到ERP更新,用SCP送到伺服器...方便自己的一些工作自動化,而不用啥都要呼叫什麼程式出來處理

1
微笑
iT邦研究生 5 級 ‧ 2021-01-28 17:52:27

批次檔本身能做的不多,如果一定要用批次檔

預設列印word與文字檔的前提下可以使用此指令

for %%x in (*.doc;*.txt) do "C:\Program Files\Microsoft Office\Office15\WINWORD.EXE" "%%x" /q /n /mFilePrintDefault /mFileExit  

其中 C:\Program Files\Microsoft Office\Office15\WINWORD.EXE 是word檔的路徑名稱
列印文件與bat檔位於同一目錄即可

假設要列印PDF的情況可以參考此篇

如果想要使用bat檔的原因是待處理檔案過多的話可以參考此篇

建議把檔案列印這個動作另外做成一個exe(語言不拘),然後用bat檔來做批次處理
雖然如果有辦法做出exe,原則上會建議直接把所有功能一次寫好就可以了

我要發表回答

立即登入回答