Powershell - аргумент с пробелами в одинарных и двойных кавычках
Этот код берет каталог с tiffs, использует tiflib tiffcp.exe и вставляет другой tiff на первой странице, которая является уведомлением об авторских правах. Часть, которая постоянно ошибается, - это когда я вызываю сжатие. & $tool -c lzw
Ошибка это дает
& $tool -c lzw `
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (TIFFReadDirecto...4) encountered.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Теперь я знаю, что это потому, что в аргументе есть пробел. Я попытался поместить его в двойные кавычки, одинарные кавычки, поместить его в параметр, поместить его в два параметра и множество других вещей. Независимо от того, что я делаю, кажется, что часть LZW выдает ошибку. Я должен сказать, что это все еще работает по некоторым причинам. Он по-прежнему вставляет страницу и перемещает старую копию. Спасибо за любую помощь, которая может быть оказана.
$tool = 'c:\tiff-3.8.2-1-bin\bin\tiffcp.exe'
$tifs = get-childitem . | where {$_.Extension -match "tif"}
foreach($tif in $tifs)
{
if ($tif -like '*copyright*')
{
"File already has copyright notice " + $tif
}
else
{
'Processing ' + $tif.Name
$output = "copyright-$tif"
& $tool "-c lzw" `
"c:\copyright pages\copyright.tif" $tif.FullName $output
Move-Item $tif C:\backup
}
}
3 ответа
Я считаю, что я стал жертвой ошибки / выбора в самой Poweshell. Я думаю, что столкнулся с этой проблемой.
Игнорирование уровня ошибки!= 0 в Windows Powershell
а также
Тем не менее, я буду принимать ответы, приведенные здесь, как способы очистки моего кода. Спасибо за помощь!
Попробуйте вместо этого использовать массив аргументов.
$Args = @("-c lzw","c:\copyright pages\copyright.tif",$tif.FullName,$output)
& $tool $Args
Или, если вас это не устраивает, вы можете присвоить переменные всему и просто бросить переменные в оператор вызова следующим образом:
$arg1 = "-c lzw"
$arg2 = "c:\copyright pages\copyright.tif"
$arg3 = $tif.FullName
& $tool $arg1 $arg2 $arg3 $output
Этот код:
$output = "copyright-$tif"
& $tool "-c lzw" "c:\copyright pages\copyright.tif" $tif.FullName $output
В результате команда выглядит примерно так:
tiffcp.exe -c lzw "1.tif" "c:\2.tif" "copyright-c:\2.tif"
Проблема в том, что "copyright-$tif"
помещает полный путь к файлу, и это делает вывод бессмысленным именем файла.
Пытаться:
$tool = 'c:\tiff-3.8.2-1-bin\bin\tiffcp.exe'
$tifs = Get-ChildItem .\*.tif
foreach ($tif in $tifs)
{
if ($tif -like '*copyright*')
{
write "File already has copyright notice $tif"
} else {
write "Processing $tif"
$output = "copyright-$($tif.Name)"
& $tool -c lzw "c:\copyright pages\copyright.tif" $tif.FullName $output
Move-Item $tif C:\backup
}
}
Комментарии:
Get-ChildItem может найти *.tif напрямую, не получая все файлы и не используя куда, поэтому я изменил это.
Используемая строковая интерполяция для `"Processing $tif"и аналогичных
Я думаю
if ($tif -match 'copyright')
или жеif ($tif.Name.Contains("copyright"))
чувствую себя лучше, но почему бы не отфильтровать их раньше, когда вы становитесь ребенком?
РЕДАКТИРОВАТЬ пример кода, отфильтровывая уже защищенные авторским правом:
например
$tool = 'c:\tiff-3.8.2-1-bin\bin\tiffcp.exe'
$tifs = (gci .\*.tif | ?{ $_.Name -notmatch "copyright" })
foreach ($tif in $tifs) {
write "Processing $tif"
& $tool -c lzw "c:\copyright pages\copyright.tif" "$tif" "copyright-$($tif.Name)"
Move-Item $tif C:\backup
}