我不會用批次檔做這種事,恕我太笨
但如果你肯學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();
}
}
}
}
批次檔本身能做的不多,如果一定要用批次檔
預設列印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,原則上會建議直接把所有功能一次寫好就可以了