如何在PowerShell中为多个文件运行命令

时间:2019-05-15 10:25:37

标签: powershell image-processing

我有一个包含图像的文件夹,我需要使用ImageMagick对其进行转换。如何在Powershell中为每个文件(作为参数)运行命令?

3 个答案:

答案 0 :(得分:1)

Get-ChildItem返回一个FileInfo对象的数组,您不应将它们视为仅包含路径和文件名的字符串。
而是使用这些对象FullNameName

的属性
Get-ChildItem -Path "C:\Pictres" -File | ForEach-Object {
    # The automatic variable '$_' or '$PSItem' contains the current object in the PowerShell pipeline.
    $originalImage  = $_.FullName
    $convertedImage = Join-Path -Path $_.DirectoryName -ChildPath ('test_{0}' -f $_.Name)
    & 'C:\INSTALL\ImageMagick-7.0.8-Q16\magick.exe' "$originalImage" -negate "$convertedImage"
}

答案 1 :(得分:1)

为了提高效率(因为我可以通过使用数组v4看到您在ForEach上),因此可以使用-File上的Get-ChildItem开关(在v3中引入),仅获取您需要的文件。此外,使用foreach关键字比.ForEach()ForEach-Object更具可读性和性能。

您可以使用调用运算符来运行外部可执行文件(&):

$magick = 'C:\INSTALL\ImageMagick-7.0.8-Q16\magick.exe'

$path = 'C:\Pictres'
foreach ($file in Get-ChildItem -Path $path -File) {
    & $magick "$($file.FullName)" -negate "$path\test_$($file.Name)"
}

答案 2 :(得分:-1)

使用Get-ChildItemForEach$PSItem是自动定义的

(Get-ChildItem -Path "C:\Pictres").ForEach({
 >> $BuildName = "C:\Pictres\$PSItem"
 >> $BuildName2 = "C:\Pictres\test_$PSItem"
 >> C:\INSTALL\ImageMagick-7.0.8-Q16\magick.exe "$BuildName" -negate "$BuildName2"
 >> }
 >> )