编写宏以将变量输入到shell命令

时间:2014-07-15 22:58:25

标签: vba shell excel-vba exiftool excel

我有一个excel文件,其中包含20k +图像的元数据信息。我正在尝试编写一个宏来执行exiftool.exe(一种用于批量编辑元数据的工具),并使用相对于每一行的变量重复执行。

例如,我想运行重复的exiftool命令,这些命令从B列(“作者”)获取信息,例如:

C:\exiftool\exiftool.exe -Author="CELL B1 CONTENT"
C:\exiftool\exiftool.exe -Author="CELL B2 CONTENT"

......无限重复。

这是我到目前为止所尝试的:

    Sub EnterMetadata()
    For Each Cell In Range("C1:C20000")
    Shell("c:\Exiftool\exiftool.exe -o I:/Photos/ & ActiveCell.Offset(0, -2).Value) & " -Author=" & ActiveCell.Offset(0, -1).Value) 
    Next
    End Sub

请注意,A列包含原始文件的路径。 B列包含作者姓名。我正在尝试使用宏中A列和B列中单元格的相对信息。

提前致谢!

2 个答案:

答案 0 :(得分:1)

未测试:

Sub EnterMetadata()
    Const CMD As String = "c:\Exiftool\exiftool.exe -o ""I:/Photos/{fn}"" -Author=""{auth}"""
    Dim Cell as Range, s as String

    For Each Cell In Range("C1:C20000")
        s = Replace(CMD, "{fn}", Cell.Offset(0, -2).Value)
        s = Replace(s, "{auth}", Cell.Offset(0, -1).Value)

        Debug.Print s


        Shell s
    Next
End Sub

如果您的任何命令行参数可能包含空格,那么您应该引用它们(引号在VBA字符串中通过加倍来转义)

答案 1 :(得分:1)

如何使用ShellExecute

这是您需要在宏中声明的内容,以便您可以使用它:

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
    ByVal hWnd As Long, _
    ByVal lpOperation As String, _
    ByVal lpFile As String, _
    ByVal lpParameters As String, _
    ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) As Long

您可以将参数作为字符串(lpParameters)传递给它,获取返回值以帮助理解出现问题时发生的情况,并且通常比使用Shell更通用。

你可以做类似的事情(这是测试,因为我没有exiftool):

ShellExecute 0, vbNullString, "C:\exiftool\exiftool.exe", "-Author=""CELL B1 CONTENT""", vbNullString, 10 ' 10=SW_SHOWDEFAULT

我会根据您的要求填写作者。

有关ShellExecuteclick here的详细信息,请查看MSDN。