【问题标题】:Is there a command on windows command line that adds a local printer port?Windows 命令行上是否有添加本地打印机端口的命令?
【发布时间】:2019-04-09 12:28:43
【问题描述】:

我使用 PowerShell:

Add-PrinterPort -Name "NameYourLocalPort:"

添加本地打印机端口。

windows命令行对应的命令是什么?

我已经阅读了这个和其他一些答案,但它们没有解决我的问题。

Create a local port for a printer

【问题讨论】:

    标签: powershell cmd command-line


    【解决方案1】:

    您可以使用 Printing_Admin_Scripts 添加打印机端口

    cd c:\windows\system32\printing_admin_scripts\en-us\
    
    cscript prnmngr.vbs -a -p "PrinterName" -m "PrinterDriver" -r "lpt1:"
    

    【讨论】:

      【解决方案2】:
      public static class Winspool
          {
              [StructLayout(LayoutKind.Sequential)]
              private class PRINTER_DEFAULTS
              {
                  public string pDatatype;
                  public IntPtr pDevMode;
                  public int DesiredAccess;
              }
      
              [DllImport("winspool.drv", EntryPoint = "XcvDataW", SetLastError = true)]
              private static extern bool XcvData(
                  IntPtr hXcv,
                  [MarshalAs(UnmanagedType.LPWStr)] string pszDataName,
                  IntPtr pInputData,
                  uint cbInputData,
                  IntPtr pOutputData,
                  uint cbOutputData,
                  out uint pcbOutputNeeded,
                  out uint pwdStatus);
      
              [DllImport("winspool.drv", EntryPoint = "OpenPrinterA", SetLastError = true)]
              private static extern int OpenPrinter(
                  string pPrinterName,
                  ref IntPtr phPrinter,
                  PRINTER_DEFAULTS pDefault);
      
              [DllImport("winspool.drv", EntryPoint = "ClosePrinter")]
              private static extern int ClosePrinter(IntPtr hPrinter);
      
              public static int AddLocalPort(string portName)
              {
                  PRINTER_DEFAULTS def = new PRINTER_DEFAULTS();
      
                  def.pDatatype = null;
                  def.pDevMode = IntPtr.Zero;
                  def.DesiredAccess = 1; //Server Access Administer
      
                  IntPtr hPrinter = IntPtr.Zero;
      
                  int n = OpenPrinter(",XcvMonitor Local Port", ref hPrinter, def);
                  if (n == 0)
                      return Marshal.GetLastWin32Error();
      
                  if (!portName.EndsWith("\0"))
                      portName += "\0"; // Must be a null terminated string
      
                  // Must get the size in bytes. Rememeber .NET strings are formed by 2-byte characters
                  uint size = (uint)(portName.Length * 2);
      
                  // Alloc memory in HGlobal to set the portName
                  IntPtr portPtr = Marshal.AllocHGlobal((int)size);
                  Marshal.Copy(portName.ToCharArray(), 0, portPtr, portName.Length);
      
                  uint needed; // Not that needed in fact...
                  uint xcvResult; // Will receive de result here
      
                  XcvData(hPrinter, "AddPort", portPtr, size, IntPtr.Zero, 0, out needed, out xcvResult);
      
                  ClosePrinter(hPrinter);
                  Marshal.FreeHGlobal(portPtr);
      
                  return (int)xcvResult;
              }
          }
      

      然后只需在您的代码上调用Winspool.AddLocalPort(@"C:\MyLocalPortName.txt");

      【讨论】:

        猜你喜欢
        • 2021-08-14
        • 2021-05-14
        • 2013-10-08
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多