管道多线powershell结果在一行中产生多个参数

时间:2016-12-03 04:18:34

标签: powershell imagemagick imagemagick-convert

我正在尝试编写一个oneliner,它在目录中获取tif文件的唯一ID,然后运行ImageMajick的convert将它们组合成多个tifs:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

这样可行,但我正在尝试将其自动化为一堆具有多个tif的ID。现在,我只使用一个id并使用“echo”而不是convert:

convert ..\image_data\ua-nws_00000991_001.tif ..\image_data\ua-nws_00000991_002.tif ..\image_data\ua-nws_00000991_003.tif ..\image_data\ua-nws_00000991_004.tif ua-nws_00000991_all.tif

但我无法将文件列表转换为参数列表。我得到以下内容(我手动制作了相对于在线发布的路径):

echo "ua-nws_00000991" | % { $id=$_; ls ../image_data | ? { $_.FullName -match $id } | % { 
    echo $_.FullName } | Join-String -Separator '" "' | % { echo '"'$_'"' $id"_all.tif" }
}

在我添加双引号之前,convert将所有最终" .\image_data\ua-nws_00000991_001.tif" ".\image_data\ua-nws_00000991_002.tif" ".\image_data\ua-nws_00000991_003.tif" "C:\Daniels_Stuff\Classes\Current\grad_ai\project\repo\article-reconstruction\image_data\ua-nws_00000991_004.tif" ua-nws_00000991_all.tif 解释为一个参数。我正在添加引号以强制转换为将它们视为多个参数。但我似乎无法摆脱那个换行符。我认为它可能是由最终的$_引起的,但如果我用convert替换它,我会得到以下结果:

echo

2 个答案:

答案 0 :(得分:1)

虽然我不理解Powershell疯狂的语法,但 ImageMagick 有两个方面可以帮助你...

方面1 - stdin上的文件名

首先,您可以将文件名列表合并到 ImageMagick &#39> stdin 中的单个TIF中,而不是作为参数。所以,如果你有一本书的3页,在3个名为p1.tifp2.tifp3.tif的文件中,而不是:

convert p*.tif book.tif

你也可以

dir /b/s p*tif | convert @- book.tif

虽然我使用DIR /B/S生成上面的名称,但我希望您能用Powershell命令替换它。

方面2 - 单个管道下的多个图像

其次,您可以使用&#34; Magick图像文件格式&#34; 将多个convert调用中的多个图像传输到convert的最后调用中( MIFF)流媒体:

以下是一个示例,其中convert的两次调用都将每个图像发送到最终convert,该最终( convert p1.tif MIFF:- & convert p2.tif MIFF:- ) | convert MIFF:- book.tif 加入来自其MIFF输入流的图像:

FOR files *.TIF; DO
   IF this file has the correct id
      convert $this MIFF:-
   ENDIF
ENDDO | convert MIFF:- book.tif 

以下是同一事物的略微不同的例子:

from

答案 1 :(得分:-1)

您可以尝试以下方法:

get-childitem "image_data" -recurse -filter ua-nws_00000991*.tif | % { convert $_.Fullname }

返回&#34; image_data&#34;中的所有tif文件目录并为每个找到的tif文件调用convert

希望有所帮助