编写向Windows Shell传递命令的Excel宏

jhkqcmku  于 2023-06-06  发布在  Shell
关注(0)|答案(2)|浏览(110)

我有一个包含20k+图像元数据信息的Excel文件。我尝试编写一个宏,它在Windows Shell上使用exiftool.exe(一种用于批量编辑元数据的工具)执行命令,并使用与每行相关的变量。
例如,我想遍历exiftool命令,这些命令从B列(“Author”)获取信息,例如:

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列包含作者姓名。我试图从列AB中检索信息以在宏中使用。

dy2hfwbg

dy2hfwbg1#

未测试:

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字符串中,引号通过加倍进行转义)

bbmckpt7

bbmckpt72#

如何使用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

您可以将参数作为String(lpParameters)传递给它,获取返回值以帮助理解如果出现错误会发生什么,并且通常比使用Shell更通用。
你可以做类似的事情(* 这是没有测试,因为我没有exiftool .*):

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

我会让你根据你的要求填充作者。
有关ShellExecuteclick here的完整信息,请访问MSDN。

相关问题