Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1301
  • Last Modified:

How can I print out automatically several pdf files in defined folder with powershell ?

Hi folks,

There is a script that displays the numbers of some the invoices from Excel 2010 workbook. how can I print these invoices are stored in PDF format in a folder. I am attach the script with one of the many attempts. and the error message.



Open in new window

$ex = New-Object -ComObject Excel.Application
$ex.Visible = 1
$wb = $ex.Workbooks.Open("C:\users\dov143\Documents\Template.xlsx")
$ws = $wb.Worksheets.Item(1)

$result = @()

[int]$rmax = $ws.Range("G65536").End(-4162).Row
$ws.Range("G3:G$rmax") | Where {$_.Value2} | Foreach {
      $col = $_.Column+1
      $row = $_.Row
      $val = $ws.Cells.Item($row,$col)
      
      $result += [pscustomobject]@{
      
      Invoices = [System.Convert]::ToString("S:\invoices\0070\"+($_.Value2)+".pdf")
            Values = $val.Value2
            
      }
}
      
$result | Where {!$_.Values} | Foreach-Object { Start-Process -FilePath s:\INVOICES\0070\*.pdf –Verb Print}

 
$ex.Quit()

Open in new window





Open in new window

Start-Process : This command cannot be run due to the error: The system cannot find the file
specified.
At C:\PowerShell\Scripts\Invoices-pdf.ps1:25 char:49
+ $result | Where {!$_.Values} | Foreach-Object { Start-Process -FilePath s:\INVOI ...
+                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationExcepti
   on
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartP
   rocessCommand

Open in new window

0
nesher13
Asked:
nesher13
  • 10
  • 8
1 Solution
 
Justin YeungSenior Systems EngineerCommented:
Start-Process : This command cannot be run due to the error: The system cannot find the file
 specified.
 At C:\PowerShell\Scripts\Invoices-pdf.ps1:25 char:49
 + $result | Where {!$_.Values} | Foreach-Object { Start-Process -FilePath s:\INVOI ...
 +                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationExcepti
    on
     + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartP
    rocessCommand

if you look at the error it is trying to print the document at c:\powershell\scripts\ folder which doesn't exist.

you can simply do a set-location before "Start-Process -FilePath s:\INVOICES\0070\*.pdf –Verb Print"

set-location s:\
0
 
nesher13Author Commented:
Justin Yeung

1.In line begining Sresult I made a mistake. line looked like:
 $result | Where {!$_.Values} | Foreach {$_.Invoices} | Start-Process -FilePath s:\INVOICES\0070\*.pdf –Verb Print

2.I do not quite understand where I have to insert: s:\ or s:\invoices\0070, in the pipeline?
0
 
Justin YeungSenior Systems EngineerCommented:
since the script looks like it is running locally on the machine.

you can set-location even at the beginning of the script.

set-location S:\

basically when you start powershell, it prompted a current location as you see c:\users\xxxx>

which powershell assume all value are store on that location unless you change it by using set-location
0
Who's Defending Your Organization from Threats?

Protecting against advanced threats requires an IT dream team – a well-oiled machine of people and solutions working together to defend your organization. Download our resource kit today to learn more about the tools you need to build you IT Dream Team!

 
nesher13Author Commented:
Justin Yeung

I followed your advice and put the cmdlet set-location s:\
in the beginning of the script. That looks like now:


Open in new window

$ex = New-Object -ComObject Excel.Application
$ex.Visible = 1
$wb = $ex.Workbooks.Open("C:\users\dov143\Documents\Hoveret-3-Eli.xlsx") #Template.xlsx")
$ws = $wb.Worksheets.Item(1)

Set-Location s:\

$result = @()

[int]$rmax = $ws.Range("G65536").End(-4162).Row
$ws.Range("G3:G$rmax") | Where {$_.Value2} | Foreach {
      $col = $_.Column+1
      $row = $_.Row
      $val = $ws.Cells.Item($row,$col)
      
      $result += [pscustomobject]@{
            Invoices = [System.Convert]::ToString($_.Value2)+".pdf"
            Values = $val.Value2
      }
}
      $result | Where {!$_.Values} | Foreach {$_.Invoices} |  Copy-Item c:\Users\dov143\Documents -Destination D:\dov2
   
   #Dir D:\dov2\*.pdf | Foreach-Object { Start-Process -FilePath $_.FullName –Verb Print }
   
$ex.Quit()

Open in new window


I also enclose an error message :


Open in new window

the command does not take pipeline input or the input and its properties do not match any of
 the parameters that take pipeline input.
At C:\PowerShell\Scripts\Invoices-pdf.ps1:25 char:58
+     $result | Where {!$_.Values} | Foreach {$_.Invoices} |  Copy-Item c:\Users\dov1 ...
+                                                             ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (סה"כ שולם.pdf:String) [Copy-Item], Parameter
   BindingException
    + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.CopyItemComm
   and

Open in new window

0
 
Justin YeungSenior Systems EngineerCommented:
where is the document actually converted to?

I can see that you changed your destination with the script provided previously.
0
 
Justin YeungSenior Systems EngineerCommented:
the command does not take pipeline input or the input and its properties do not match any of
  the parameters that take pipeline input.
 At C:\PowerShell\Scripts\Invoices-pdf.ps1:25 char:58
 +     $result | Where {!$_.Values} | Foreach {$_.Invoices} |  Copy-Item c:\Users\dov1 ...

it looks like there isn't any properties related to Inovices

can you do a get-member of

 $result | Get-Member
0
 
nesher13Author Commented:
Justin Yeung
............................
1.  misspeling  Dir D:\dov2\*.pdf | Foreach-Object { Start-Process -FilePath $_.FullName –Verb Print } instead
# Dir D:\dov2\*.pdf | Foreach-Object { Start-Process -FilePath $_.FullName –Verb Print }

 TypeName: System.Management.Automation.PSCustomObject

2
PS S:\> $result | gm
Name        MemberType   Definition                        
----        ----------   ----------                        
Equals               Method             bool Equals(System.Object obj)    
GetHashCode Method       int GetHashCode()                
GetType           Method       type GetType()                    
ToString           Method       string ToString()                
Invoices           NoteProperty System.String Invoices=7137616.pdf
Values              NoteProperty System.Double Values=188949.27
0
 
Justin YeungSenior Systems EngineerCommented:
$result | Where {!$_.Values} | Foreach {$_.Invoices | Copy-Item c:\Users\dov1 ...}

The pipeline should be within the $_.invoices...... it is doing it for each object.

you don't need the set-location for the script and it should work fine
0
 
nesher13Author Commented:
Justin Yeung

the script still does not work
...................................................................................................
$result = @()

[int]$rmax = $ws.Range("G65536").End(-4162).Row
$ws.Range("G3:G$rmax") | Where {$_.Value2} | Foreach {
      $col = $_.Column+1
      $row = $_.Row
      $val = $ws.Cells.Item($row,$col)
      
      $result += [pscustomobject]@{
      
      Invoices = [System.Convert]::ToString($_.Value2)+".pdf"
            Values = $val.Value2
            
       }
      }
$result | Where {!$_.Values} | Foreach {$_.Invoices |  Copy-Item c:\Users\dov143\Documents -Destination D:\dov2}
.......................................................................................................................................................
Copy-Item : The input object cannot be bound to any parameters for the command either because
 the command does not take pipeline input or the input and its properties do not match any of
 the parameters that take pipeline input.
At C:\PowerShell\Scripts\Invoices-pdf.ps1:24 char:57
+     $result | Where {!$_.Values} | Foreach {$_.Invoices |  Copy-Item c:\Users\dov14 ...
+                                                            ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (7141157.pdf:String) [Copy-Item], ParameterBi
   ndingException
    + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.CopyItemComm
   and

.........................................
0
 
Justin YeungSenior Systems EngineerCommented:
$result | Where {!$_.Values} | Foreach {write-host $_.Invoices}

what's the result of the $_.invoices?

it doesn't seem like it can pass the value to the pipeline.
0
 
nesher13Author Commented:
Justin Yeung

it displays a list of pdf files (Invoices)
0
 
Justin YeungSenior Systems EngineerCommented:
$_.invoices should be the actualy file name like "something.pdf" so then it doesn't need to pass to pipeline since nothing to pass.

$result | Where {!$_.Values} | Foreach {Copy-Item c:\Users\dov143\Documents\$($_.invoices) -Destination D:\dov2}
0
 
nesher13Author Commented:
Justin Yeung

Copy-Item : Cannot find path 'C:\Users\dov143\Documents\test1.pdf' because it does not exist

At C:\PowerShell\Scripts\Invoices-pdf.ps1:30 char:42

Copy-Item : Cannot find path 'C:\Users\dov143\Documents\test2.pdf' because it does not exist

At C:\PowerShell\Scripts\Invoices-pdf.ps1:30 char:42
0
 
Justin YeungSenior Systems EngineerCommented:
where is the actual file located after it coverted to PDF?
0
 
nesher13Author Commented:
Hi folks

The solution:


Open in new window

$ex = New-Object -ComObject Excel.Application
$ex.Visible = 1
$wb = $ex.Workbooks.Open("C:\users\dov143\Documents\Template.xlsx")
$ws = $wb.Worksheets.Item(1)

$result = @()

[int]$rmax = $ws.Range("G65536").End(-4162).Row
$ws.Range("G3:G$rmax") | Where {$_.Value2} | Foreach {
      $col = $_.Column+1
      $row = $_.Row
      $val = $ws.Cells.Item($row,$col)
      
      $result += [pscustomobject]@{
            Invoices = $_.Value2
            Values = $val.Value2
      }
}
      
$result | Where {!$_.Values} | Foreach {$_.Invoices}

$ex.Quit()

Open in new window

0
 
Justin YeungSenior Systems EngineerCommented:
$result | Where {!$_.Values} | Foreach {$_.Invoices}

I think it will just list all the invoices with your command.........

but it is not going to do anything.
0
 
nesher13Author Commented:
Justin Yeung

The script is working

 Where
{!$_.Values}
is OK
0
 
Justin YeungSenior Systems EngineerCommented:
glad that you have it resolved.
0

Featured Post

Visualize your virtual and backup environments

Create well-organized and polished visualizations of your virtual and backup environments when planning VMware vSphere, Microsoft Hyper-V or Veeam deployments. It helps you to gain better visibility and valuable business insights.

  • 10
  • 8
Tackle projects and never again get stuck behind a technical roadblock.
Join Now