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

а также

https://superuser.com/questions/213848/using-powershell-call-native-command-line-app-and-capture-stderr

Тем не менее, я буду принимать ответы, приведенные здесь, как способы очистки моего кода. Спасибо за помощь!

Попробуйте вместо этого использовать массив аргументов.

$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
}
Другие вопросы по тегам