Jump to content

Problems with run() and quotation marks?


 Share

Recommended Posts

Hi,

I am trying to register a network printer. The following command works perfectly in the vista commandline:

rundll32 printui.dll,PrintUIEntry /if /b "HP LaserJet 2100 Series PS" /f %windir%\inf\ntprint.inf /r "LaserJetPort" /m "HP LaserJet 2100 Series PS"

I tried to execute the above commandline with AutoIt the following way:

Run('rundll32.exe printui.dll,PrintUIEntry /if /b "HP LaserJet 2100 Series PS" /f %windir%\inf\ntprint.inf /r "LaserJetPort" /m "HP LaserJet 2100 Series PS"');

But the AutoIt-command fails with an error 0x00000003. How can I determine what the problem is? As it is working in the command line I assume that there is something wrong with the quotation marks. Any hints?

Regards,

jakewalk

Link to comment
Share on other sites

Welcome to the forums.

When I run this code, I get a message (from the install operation) that the operation could not be completed.

I'm not sure, but I think the problem could be where you use the /r switch. Otherwise there is nothing wrong with the quotes.

Link to comment
Share on other sites

try this ( im not sure )

Run("rundll32.exe printui.dll","PrintUIEntry /if /b HP LaserJet 2100 Series PS  /f %windir%\inf\ntprint.inf /r LaserJetPort /m HP LaserJet 2100 Series PS");
That won't work. You can't set the Working Dir to be the parameters.... :P
Link to comment
Share on other sites

Thanks both of you for the very fast reply.

@Brettf: When I paste the first code into a commandline window it works flawlessly. So the /r switch shouldn't be the problem. When I run the second code from within autoit, I get the same message as you. The commandline should be correct, but the Autoit-code probably isn't.

@oMBra: When I run your code, nothing happens. The run()-function returns a "0", and @error contained a "0", too.

Regards,

jakewalk

Link to comment
Share on other sites

I made this tool for installing network printers that are on a print server. You can use it as is, or tweak it to your taste.

#cs
    Network Printer Utility 1.0 beta
    Designed by the CTS Script team
    July 2006
    A big THANK YOU goes to big_daddy. His help
    was invaluable in fixing some issues. 
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    History
    July 2006: Initial release.
    
    ---------------
    Known issues:
    Will not work on Novell servers.
    
#ce
#include <GuiConstantsEX.au3>
#include <WindowsConstants.au3>
#include <Process.au3>
#include <Array.au3>
$g_szVersion = "PrintInst.exe"
If WinExists($g_szVersion) Then Exit
Opt("TrayIconDebug", 1) ;debug is on

Dim $hService, _
        $data, _
        $sPrinter, _
        $sPrinterList, _
        $font = "Comic Sans MS", _
        $Input[12], $Combo[7], $radio[7], _
        $check[11], $Button[6]

Global Enum Step + 25 _
        $CON_POS_1 = 25, _
        $CON_POS_2, _
        $CON_POS_3, _
        $CON_POS_4, _
        $CON_POS_5, _
        $CON_POS_6, _
        $CON_POS_7, _
        $CON_POS_8, _
        $CON_POS_9, _
        $CON_POS_10, _
        $CON_POS_11

GUICreate("", 600, 290, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
GUICtrlCreateLabel("\\", 20, 54, 10, 20)
$iniread_1 = IniRead(@ScriptDir & "/npu.ini", "SERVER", "SERVER", "")
$iniread_2 = IniRead(@ScriptDir & "/npu.ini", "Printers", "PLIST", "")
iniwrite(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "")
$iniread_3 = IniRead(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "")
$LocalPrinters = StringSplit($iniread_3, "|")
If $LocalPrinters[0] > 10 Then
    ReDim $LocalPrinters[11]
EndIf

$Input[1] = GUICtrlCreateInput($iniread_1, 35, 50, 100, 20)

For $i = 2 To 11
    $Input[$i] = GUICtrlCreateInput("", 270, Eval("CON_POS_" & $i - 1), 270, 21)
    If ($i - 1) <= $LocalPrinters[0]Then
        GUICtrlSetData(-1, $LocalPrinters[$i - 1])
    EndIf
Next

For $i = 1 To 6
    $Combo[$i] = GUICtrlCreateCombo("", 20, Eval("CON_POS_" & $i + 2), 170, 21)
    GUICtrlSetData(-1, $iniread_2)
    $radio[$i] = GUICtrlCreateRadio("", 210, Eval("CON_POS_" & $i + 2), 15, 21)
Next

For $i = 1 To 10
    $check[$i] = GUICtrlCreateCheckbox("", 550, Eval("CON_POS_" & $i), 20, 20)
Next

GUICtrlCreateLabel("Currently install printers", 270, 3, 200, 21)
GUICtrlCreateLabel("Delete", 550, 7, 100, 21)
GUICtrlCreateGroup("Default", 200, 62, 50, 160)

$Button[1] = GUICtrlCreateButton("Run", 20, 225, 35, 30)
$Button[2] = GUICtrlCreateButton("Exit", 65, 225, 35, 30)
$Button[3] = GUICtrlCreateButton("Find", 146, 50, 43, 20)
$Button[4] = GUICtrlCreateButton("Find", 498, 3, 43, 20)
$Button[5] = GUICtrlCreateButton("Restart Spooler", 110, 225, 80, 30)

$Label_1 = GUICtrlCreateLabel("   Network Printer Utility" & @CRLF & "for Windows Print Servers", 20, 0, 240, 50)
GUICtrlSetFont(-1, 10, 400, "", $font)
$Label_2 = GUICtrlCreateLabel("2006 CTS Scripting Team", 40, 270, 130, 25)
$_dummy = GUICtrlCreateDummy()

GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $Button[1]
            _Rprinter()            
            _instprint()
            MsgBox(0, "", "Done!", 3)
        Case $Button[2]
            ExitLoop
        Case $Button[3]
            $data = GUICtrlRead($Input[1], 0)
            _netprint1()
        Case $Button[4]
            _getinstalledPrinters()
        Case $Button[5] 
            _restart() ;restarts the print spooler. 
        Case Else
            ;;;
    EndSwitch
WEnd

Exit

Func _netprint1()
    $hService = ObjGet("winmgmts:{impersonationLevel=impersonate}!" & "\\" & $data & "\root\cimv2")
    If @error Then
        MsgBox(48, "ERROR", "No Printers Found. Possible issues: " & @CRLF _
                 & "" & @CRLF _
                 & "  1. The Windows Print Server name has been entered in incorrectly." & @CRLF _
                 & "  2. You are trying to access a Novell Server. This utility does not support Novell Print Servers." & @CRLF _
                 & "  3. There are no printers shared on the Windows Print Server you selected.")
    Else
        _np2()
    EndIf
EndFunc   ;==>_netprint1

Func _np2()
    Local $i = 0
    Local $sPrinters = ""
    Local $aArray[1]
    
    SplashTextOn("", "Gathering printers, please wait...", 150, 75)
    
    For $y = 1 To 6
        GUICtrlSetData($Combo[$y], "")
    Next
    IniWrite(@ScriptDir & "/npu.ini", "Printers", "PLIST", "")
    
    $oPrinterList = $hService.ExecQuery ("Select * From Win32_Printer")
    
    For $oPrinter In $oPrinterList
        ReDim $aArray[$i + 1]
        $aArray[$i] = StringUpper($oPrinter.name)
        $i += 1
    Next
    
    _ArraySort($aArray)
    
    For $i = 0 To UBound($aArray)-1
        For $y = 1 To 6
            GUICtrlSetData($Combo[$y], $aArray[$i])
        Next
    Next
        
    $iElements = UBound($aArray) - 1
    For $x = 0 To $iElements
        If $x = $iElements Then
            $sPrinters &= $aArray[$x]
        Else
            $sPrinters &= $aArray[$x] & "|"
        EndIf
    Next
    
    IniWrite(@ScriptDir & "/npu.ini", "Printers", "PLIST", $sPrinters)
    $dataget2 = GUICtrlRead($Input[1], 0)
    IniWrite(@ScriptDir & "/npu.ini", "SERVER", "SERVER", $dataget2)
    SplashTextOn("", "Select what printers you wish to install", 150, 75)
    Sleep(2000)
    SplashOff()
EndFunc   ;==>_np2

Func _instprint()
    Local $ComboGet[7], $RadioGet[7]
    
    SplashTextOn("", "Installing printer, please wait...", 150, 75)
    
    $InputGet = GUICtrlRead($Input[1], 0)
    
    For $i = 1 To 6
        $ComboGet[$i] = GUICtrlRead($Combo[$i], 0)
        $RadioGet[$i] = GUICtrlRead($radio[$i], 0)
    Next
    
    For $i = 1 To 6
        If $ComboGet[$i] <> "" Then             
            RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /ga /c\\" & @ComputerName & " /n\\" & $InputGet & "\" & $ComboGet[$i])  
        EndIf
    Next
    _RunDOS("NET STOP spooler")
    _RunDOS("NET START spooler")
    sleep(10000)
    For $i = 1 To 6 
            If $RadioGet[$i] = 1 Then
                If $ComboGet[$i] <> "" Then
                RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n\\"&$iniread_1&"\"& $ComboGet[$i])
                endif
            EndIf   
            GUICtrlSetData($Combo[$i],"")
            GUICtrlSetState($radio[$i], $GUI_UNCHECKED)
            sleep(50)
            GUICtrlSetData($Combo[$i],$iniread_2)            
    Next
    SplashOff()
EndFunc   ;==>_instprint

func _restart()
    SplashTextOn("", "Stopping Print Spooler, please wait...", 150, 75)
    _RunDOS("NET STOP spooler")
    SplashOff()
    SplashTextOn("", "Starting Print Spooler, please wait...", 150, 75)
    _RunDOS("NET START spooler")
    SplashOff()
EndFunc 

Func _getinstalledPrinters()
    
    SplashTextOn("", "Gathering installed printers, please wait...", 200, 75)
    
    IniWrite(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "")
    $hService = ObjGet("winmgmts:{impersonationLevel=impersonate}!" & "\\" & @ComputerName & "\root\cimv2")
    $sPrinterList = $hService.ExecQuery ("Select * From Win32_Printer")
    ConsoleWrite('$sPrinterList.count = ' & $sPrinterList.count & @LF)
    For $sPrinter In $sPrinterList
        ConsoleWrite('$sPrinter.name = ' & $sPrinter.name & @LF)
        $rd3 = IniRead(@ScriptDir & "/npu.ini", "Printers", "LOCAL", "")
        IniWrite(@ScriptDir & "/npu.ini", "Printers", "LOCAL", $rd3 & $sPrinter.name & "|")
    Next
    $local = StringSplit(IniRead(@ScriptDir & "/npu.ini", "Printers", "LOCAL", ""), "|")
    If UBound($local) < 11 Then ReDim $local[11]
    For $i = 1 To 10
        GUICtrlSetData($Input[$i + 1], $local[$i])
    Next
    
    SplashOff()
EndFunc   ;==>_getinstalledPrinters

Func _Rprinter()
    Local $InputGet[11]
    For $i = 2 To 11
        $InputGet[$i - 1] = GUICtrlRead($Input[$i])
    Next
    For $i = 1 To 10
        If GUICtrlRead($check[$i]) = 1 Then
            SplashTextOn("", "Removing printer, please wait...", 150, 50)
            GUICtrlSetState($check[$i], $GUI_UNCHECKED)
            sleep(1000)
            If $InputGet[$i] <> "" Then
                $str = StringLeft($InputGet[$i], 2)
                If $str = "\\" Then
                    RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /gd /dn /n /c\\" & @ComputerName & " /n" & $InputGet[$i])
                    ;RunWait(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /gd /q /c\\" & @ComputerName & " /n" & $InputGet[$i]) ;mine original
                    ;RunWait(@ComSpec & ' /c RUNDLL32 PRINTUI.DLL,PrintUIEntry /gd /dn /q /n "' & $ret & '"', '', @SW_HIDE) ;danny35
                    GUICtrlSetData($InputGet[$i], "")
                Else
                    RunWait(@SystemDir & '\RUNDLL32 PRINTUI.DLL,PrintUIEntry /dl /q /n "' & $InputGet[$i] & '" /c\\' & @ComputerName)
                EndIf
            EndIf
        EndIf
    Next
    
EndFunc   ;==>_Rprinter


;#cs - printer install
;adds a printer
;Run(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /ga /c\\" &@ComputerName& " /n\\va017f1a\19_4200_82.248_PCL")

;&&&&

;deletes a printer
;Run(@SystemDir & "\RUNDLL32 PRINTUI.DLL,PrintUIEntry /gd /c\\" [email="&@ComputerName"]&@ComputerName[/email]& " /n\\va017f1a\19_4200_82.248_PCL")
;_rundos("NET STOP spooler")
;_rundos("NET START spooler")
; #ce
Edited by Volly
Link to comment
Share on other sites

migth be a problem with expanding %windir%

$cmd='rundll32.exe printui.dll,PrintUIEntry /if /b "HP LaserJet 2100 Series PS" /f %windir%\inf\ntprint.inf /r "LaserJetPort" /m "HP LaserJet 2100 Series PS"'
MsgBox(0,"watch the windir spec",$cmd)
Opt("ExpandEnvStrings", 1)      ;0=don't expand, 1=do expand
MsgBox(0,"watch the windir spec",$cmd)
Works.... Kinda...

Opt("ExpandEnvStrings", 1)
$cmd='rundll32.exe printui.dll,PrintUIEntry /if /b "HP LaserJet 2100 Series PS" /f %windir%\inf\ntprint.inf /r "LaserJetPort" /m "HP LaserJet 2100 Series PS"'
Run ($cmd)
Link to comment
Share on other sites

  • 2 weeks later...

Works.... Kinda...

Opt("ExpandEnvStrings", 1)
$cmd='rundll32.exe printui.dll,PrintUIEntry /if /b "HP LaserJet 2100 Series PS" /f %windir%\inf\ntprint.inf /r "LaserJetPort" /m "HP LaserJet 2100 Series PS"'
Run ($cmd)
Thanks BrettF, that works perfectly. I had to add a Sleep(5000) after the registry changes, otherwise the rundll32-process would fail, because Windows didn't finish the spooler restart. Is it possible to tell the following dos commands to run hidden and wait to continue with the following commands?

_RunDOS("NET STOP spooler")
_RunDOS("NET START spooler")
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...