2011-04-25 130 views
2

我試圖使用PowerShell,我可以使用,使列表創建一個腳本:PowerShell的 - 創建動態打印機腳本 - 輸出和命令stucture

  • 網絡打印機目前已經安裝了
  • 打印機用戶目前安裝在用戶PC上的驅動程序PC

我設法想出了以下腳本。我對PowerShell仍然很陌生,我知道它並不是最漂亮的,但它在某種程度上正在發揮作用。

$username=[Environment]::UserName 
$machinename=[Environment]::MachineName 

## Get installed printers and create template command 
$printers=get-WmiObject Win32_printer -Property Name | where { $_.Name -like "\\printserver1\*" -or $_.Name -like "\\printserver2\*" } 

$printers2=$printers | select-object Name 
$printers2 > C:\testdir\"$username"PRINTERS.txt 

$printers3=get-content C:\testdir\"$username"PRINTERS.txt | select-string -pattern "\\" 


foreach ($y in $printers3) 
{ 
write-host RUNDLL32 PRINTUI.DLL','PrintUIEntry /dn /n'"'$y 
} 

    ## Get drivers and create template command 

$printerdrivers=get-wmiobject -class Win32_PrinterDriver -Property Name 
$printerdrivers2=$printerdrivers -split('=') #| select-string 'Name' 
$printerdrivers3=$printerdrivers2 | select-string 'HP' 

foreach ($i in $printerdrivers3) 
    { 
    $removeprinter=$i -split (',') | select-string 'HP' 
    #write-host $removeprinter 
    write-host rundll32 printui.dll','PrintUIEntry /dd /c\\$machinename /m $removeprinter'"' /h "x64" /v "Type 3 - User Mode" 
    } 

上述代碼產生以下輸出:其中我有問題

RUNDLL32 PRINTUI.DLL,PrintUIEntry /dn /n"\\printserver1\ACC_PRINT_HP9040UPS                                          

rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Universal Printing PS (v5.1)" /h x64 /v Type 3 - User Mode 
rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Universal Printing PS (v5.2)" /h x64 /v Type 3 - User Mode 
rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Designjet T770 24in HPGL2" /h x64 /v Type 3 - User Mode 

是在兩個地方。

首先,是否可以在同一個腳本中運行這些命令而不將它們輸出到文本文件並將它們作爲批處理文件運行?當我試圖運行模板命令時,我不斷收到一個錯誤,指出打印機不存在。不幸的是,我不知道powershell是如何實際制定命令的。

其次,對於打印機安裝部分,由於某些原因,當我執行write-host命令時,無法在打印機名稱周圍找到引號。我可以得到它的打印機名稱的開頭顯示「‘\ printerserver1 \ ACC_PRINT_HP9040UPS’,而不是結尾。

我知道這個代碼可能是非常糟糕的,但我希望我有我的主要目標是擁有一些動態的東西,我可以在任何一臺計算機上運行,​​並清理打印機和打印機驅動程序,我將與常規的批處理文件一起運行它。我會控制「後臺打印程序」服務。

任何幫助或方向將不勝感激!

乾杯

=====================編輯部分以包含建議empo建議! 我只是想補充一下,「刪除空格」功能不是我的工作! 我在另一個網站上找到它並將其合併到我的腳本中。 Original is here

$username=[Environment]::UserName 
    $machinename=[Environment]::MachineName 
    ## this function removes all the blank spaces I had 
    Function Remove-Spaces { 
     param($target) 

     begin { 
     filter Do-RemoveSpaces { $_ -replace "\s *", "" } 
     } 

     process { if($_) { $_ | Do-RemoveSpaces } } 

     end { if($target) {$target | Do-RemoveSpaces} } 
    } 


    $printers=get-WmiObject Win32_printer -Property Name | where { $_.Name -like "\\printerserver1\*" -or $_.Name -like "\\printerserver2\*" } 
    $printers2=$printers | select-object Name | select-string -pattern "\\" 
    $printers2 > C:\testdir\"$username"PRINTERS.txt 
    $printers3=get-content C:\testdir\"$username"PRINTERS.txt | select-string -pattern "\\" 

    foreach ($y in Remove-Spaces $printers3) 
    { 
     write-output "RUNDLL32 PRINTUI.DLL, PrintUIEntry /dn /n`"$y`"" | out-file *blah* 
    } 

    $printerdrivers=get-wmiobject -class Win32_PrinterDriver -Property Name 
    $printerdrivers2=$printerdrivers -split('=') #| select-string 'Name' 
    $printerdrivers3=$printerdrivers2 | select-string 'HP' 

    foreach ($i in $printerdrivers3) 
     { 
     $removeprinter=$i -split (',') | select-string 'HP' 
     #write-host $removeprinter 
     write-output "rundll32 printui.dll, PrintUIEntry /dd /c\\$machinename /m $removeprinter`"` /h x64 /v `"Type 3 - User Mode`"" | out-file *blah* 
     } 

輸出現在看起來是這樣的:

RUNDLL32 PRINTUI.DLL, PrintUIEntry /dn /n"\\printerserver1\ACC_PRINT_HP9040UPS" 
rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Universal Printing PS (v5.1)" /h x64 /v Type 3 - User Mode 
rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Universal Printing PS (v5.2)" /h x64 /v Type 3 - User Mode 
rundll32 printui.dll,PrintUIEntry /dd /c\\machine1 /m "HP Designjet T770 24in HPGL2" /h x64 /v Type 3 - User Mode 

我相信,這將工作...希望反正。我要做一些測試,我會報告回來,並確保將其標記爲已回答!

刮開了文件修復..我想幫你剛上第一節它不工作:( 仍然需要做進一步的測試

謝謝!

回答

1

您的腳本,關於打印機。

首先,您爲什麼將打印機重定向到文本文件?

 
## Get installed printers and create template command 
$printers=get-WmiObject Win32_printer -Property Name | where { $_.Name -like "\\printserver1\*" -or $_.Name -like "\\printserver2\*" } 

用這個,你應該已經有了所有的打印機。其次,使用反引號逃避雙引號。 三,嘗試使用write-output而不是write-host

 
foreach ($printer in $printers) 
{ 
    write-output "RUNDLL32 PRINTUI.DLL, PrintUIEntry /dn /n `"$printer.name`"" 
} 

如果它還不工作,追加到管道invoke-expressionout-null

 
foreach ($printer in $printers) 
{ 
    write-output "RUNDLL32 PRINTUI.DLL, PrintUIEntry /dn /n `"$printer.name`"" | invoke-expression | out-null 
} 

您也可以嘗試invoke-item

+0

謝謝empo, 你的第一個反引號建議工作完美,實際上發現我的腳本(除其他事項)的另一個問題。 我之所以輸出到一個文本文件,因爲如果我試圖從劇本,我得到一個奇怪的輸出內處理$ PRINTER2: 「@ {名稱= \\ printerserver1 \ ACC_PRINT_HP9040UPS}」 我試圖處理這個,但我似乎無法從看起來是數組的打印機名稱中獲取打印機名稱,它只會以此格式輸出。所以當我將它插入到我的模板命令中時,該命令立即失敗。 – bourne 2011-04-25 14:06:25

+0

你爲我另外發現的是我在$ printers2中的out命令實際上包含了一大堆我不需要的額外空白空間。我設法找到一個小函數來替換空格,以便正確輸出命令。我完全相信如何重新發布代碼,但我認爲我必須修改上面的原始帖子。我會用你提供給我的編輯來做。 – bourne 2011-04-25 14:13:40

+0

很高興你發現我的答案有幫助。我編輯了代碼段,以便您能夠擺脫$ printer2和$ printer3變量。不幸的是,我現在無法測試代碼,所以認爲我的答案是猜測。歡呼聲 – 2011-04-25 18:00:30