如何从Excel宏传递批处理文件的参数?

时间:2013-12-04 09:11:07

标签: excel vba excel-vba batch-file

从excel宏我试图将参数传递给批处理文件。我的方法如下:

在Excel宏中:

passArgument()
Dim var, path As String
Dim wsh As Object
var = "#"
Set wsh = VBA.CreateObject("WScript.Shell")
path = "C:\batchFile" + "\" + "run.bat"
Shell(path + " " + var, vbNormalFocus)

我想在我所遵循的批处理文件中检索这个var,如:

set "n=%~1"
echo %n%

但它显示的是n而不是#。我是新来的,请帮助我,提前致谢

1 个答案:

答案 0 :(得分:1)

1 - 批处理文件名及其参数之间需要一个空格

2 - 如果批处理文件的路径中有空格,则需要引用完整路径和文件名

3 - 要使用WScript.Shell实例执行命令,必须调用其Run方法。在您的代码wsh.Run( ....中。如果您使用的是Shell VBA方法,则无需WScript.Shell

4 - 您正在使用未声明或初始化的strBatchName

5 - 检索批处理文件中第一个参数值的sintax是%1,没有结束百分号

6 - 您没有设置名为n的变量的值。它后面有一个空格。这应该写为set "n=%1"set "n=%~1"以删除第一个参数中的引号(如果存在)。此行中包含的引号可以防止在行中添加空格或在参数内添加特殊字符时出现问题。

已编辑 - 记录所讨论的配置

在excel中

Public Sub TestRun()

    Shell quote("d:\test.cmd") + " " + quote("&<>,;!!"), vbNormalFocus

End Sub

Public Function quote(Text As String) As String

    quote = Chr(34) + Text + Chr(34)

End Function

在批处理文件中

@echo off

    setlocal enableextensions disabledelayedexpansion
    set "n=%~1"

        setlocal enabledelayedexpansion
        echo(!n!
        endlocal

    endlocal

    pause

Shows the discussed configuration