I am trying to get powershell to call an exe with a constructed list of parameters - and to pipe the response to a log file. My issue is the redirect characters seem to be passed to the exe. (I have also struggled for nearly a day to get the right quotes around the path names which are full of spaces!!!)
The syntax for the exe is
filemeta {-d|-i|-e} [-c] [-f=<directory name>] [-x=<file name>] [-v]
[-p] [--] [--version] [-h] <file name> ...
as you can see repeats. The reason I think the redirects are being passed as another file name is firstly the error message Cannot find file " >>" and secondly the log file is not populated
The following command pasted into a command prompt does what is intended. Its just how to get it wrapped in a powershell file iteration
"C:\Program Files\File Metadata\FileMeta.exe" -i -f="M:\metadata_XML_tobe\ManagedCatalog\Business Records\Morse Bakery" "M:\ManagedCatalog\Business Records\Morse Bakery\Morse Bakery Book 1-000.JPG" >>"M:\metadata_XML_tobe\apply_doc_id_20230412-124532.log" 2>>&1
the powershell commands so far are ...
$metaDataPath = 'M:\metadata_XML_tobe'
$timeStr = get-date -Format 'yyyyMMdd-HHmmss'
$logFileName = $metaDataPath + "\apply_doc_id_" + $timeStr + ".log"
$files = Get-ChildItem -Path $metaDataPath -Recurse -Include *.xml
$quote = '"'
$hits = 0
foreach ($f in $files){
$hits++
if ($hits -ge 5) {
break
}
$directory = [System.IO.Path]::GetDirectoryName($f)
$realFile_name = $f.FullName.Replace('.metadata.xml', '')
$realFile_name = $realFile_name.Replace('\metadata_XML_tobe', '' )
$parm1 = '-i'
$parm2 = '-f='+ $quote + $directory + $quote
$parm3 = $quote + $realFile_name + $quote
$parm4 = ' >>'
$parm5 = $quote + $logFileName + $quote
$parm6 = ' 2>>&1'
Write-Host '**************'
Write-Host $f.FullName
Write-Host ' Parm1 = ' $parm1
Write-Host ' Parm2 = ' $parm2
Write-Host ' Parm3 = ' $parm3
Write-Host ' Parm4 = ' $parm4
Write-Host ' Parm5 = ' $parm5
Write-Host ' Parm6 = ' $parm6
echoargs 'C:\Program Files\File Metadata\FileMeta.exe' $parm1 $parm2 $parm3 $parm4 $parm5 $parm6
# & 'C:\Program Files\File Metadata\FileMeta.exe' $parm1 $parm2 $parm3 $parm4 $parm5 $parm6
}
which gives output of -----
M:\metadata_XML_tobe\ManagedCatalog\Church Records\Catholic Church Euroa\Baptism Records\1904-1948\Baptism Records 1904-1948-003.JPG.metadata.xml
Parm1 = -i
Parm2 = -f="M:\metadata_XML_tobe\ManagedCatalog\Church Records\Catholic Church Euroa\Baptism Records\1904-1948"
Parm3 = "M:\ManagedCatalog\Church Records\Catholic Church Euroa\Baptism Records\1904-1948\Baptism Records 1904-1948-003.JPG"
Parm4 = >>
Parm5 = "M:\metadata_XML_tobe\apply_doc_id_20230417-105352.log"
Parm6 = 2>>&1
Arg 0 is <C:\Program Files\File Metadata\FileMeta.exe>
Arg 1 is <-i>
Arg 2 is <-f=M:\metadata_XML_tobe\ManagedCatalog\Church Records\Catholic Church Euroa\Baptism Records\1904-1948>
Arg 3 is <M:\ManagedCatalog\Church Records\Catholic Church Euroa\Baptism Records\1904-1948\Baptism Records 1904-1948-003.JPG>
Arg 4 is < >>>
Arg 5 is <M:\metadata_XML_tobe\apply_doc_id_20230417-105352.log>
Arg 6 is < 2>>&1>
or if the echoargs is swapped out
**************
M:\metadata_XML_tobe\ManagedCatalog\Church Records\Catholic Church Euroa\Baptism Records\1904-1948\Baptism Records 1904-1948-003.JPG.metadata.xml
Parm1 = -i
Parm2 = -f="M:\metadata_XML_tobe\ManagedCatalog\Church Records\Catholic Church Euroa\Baptism Records\1904-1948"
Parm3 = "M:\ManagedCatalog\Church Records\Catholic Church Euroa\Baptism Records\1904-1948\Baptism Records 1904-1948-003.JPG"
Parm4 = >>
Parm5 = "M:\metadata_XML_tobe\apply_doc_id_20230417-105958.log"
Parm6 = 2>>&1
Imported metadata to M:\ManagedCatalog\Church Records\Catholic Church Euroa\Baptism Records\1904-1948\Baptism Records 1904-1948-003.JPG from M:\metadata_XML_tobe\ManagedCatalog\Church Records\Catholic Church Euroa\Baptism Records\1904-1948\Baptism Records 1904-1948-003.JPG.metadata.xml
Cannot find file " >>"
Please help me understand this maze
JC