如何在批处理文件中传递参数

Posted

技术标签:

【中文标题】如何在批处理文件中传递参数【英文标题】:How to pass argument in batch file 【发布时间】:2021-06-04 20:52:49 【问题描述】:

我正在尝试为所有使用批处理文件的用户创建一个通用路径目录。该代码会生成一个弹出窗口,并要求用户输入文件夹。该目录在终端上回显。我试图将此输出目录作为另一个函数“文件夹”中的参数传递,以便应用程序开始运行。但我无法通过论证。

@echo off
Title Browse4Folder
Color 0A
Call :Browse4Folder "Choose source folder to scan" "c:\scripts"
echo You have chosen this location "%Location%"
pause & exit
::***************************************************************************
:Browse4Folder
set Location=
set vbs="%temp%\_.vbs"
set cmd="%temp%\_.cmd"
for %%f in (%vbs% %cmd%) do if exist %%f del %%f
for %%g in ("vbs cmd") do if defined %%g set %%g=
(
    echo set shell=WScript.CreateObject("Shell.Application"^) 
    echo set f=shell.BrowseForFolder(0,"%~1",0,"%~2"^) 
    echo if typename(f^)="Nothing" Then  
    echo wscript.echo "set Location=Dialog Cancelled" 
    echo WScript.Quit(1^)
    echo end if 
    echo set fs=f.Items(^):set fi=fs.Item(^) 
    echo p=fi.Path:wscript.echo "set Location=" ^& p
)>%vbs%
cscript //nologo %vbs% > %cmd%
for /f "delims=" %%a in (%cmd%) do %%a
for %%f in (%vbs% %cmd%) do if exist %%f del /f /q %%f
for %%g in ("vbs cmd") do if defined %%g set %%g=
PAUSE


Call :Folder Location
:Folder
Set T32_PATH=%Location%
ECHO T32_PATH=%Location%


cd ..\Appl
START %Location%\t32mtc.exe -c ..\cm3550a_vecm\vlab_mcd.t32 -s ..\cm3550a_vecm\vlab_mcd_config.cmm
ECHO T32_PATH=%Location%
PAUSE

我必须将参数传递给行 START %Location%\t32mtc.exe -c ..\cm3550a_vecm\vlab_mcd.t32 -s ..\cm3550a_vecm\vlab_mcd_config.cmm 我该怎么做它。

【问题讨论】:

如果您说出您的论点是什么会有所帮助,但假设论点的值在变量argument 中,那么START "Window Title : "%Location%\t32mtc.exe" -c ..\cm3550a_vecm\vlab_mcd.t32 -s ..\cm3550a_vecm\vlab_mcd_config.cmm %argument% 可能是一个开始。第一个引用的参数将是窗口标题。文本Window Title 可以省略,但引号不能。如果完整文件名包含分隔符,则需要引用可执行文件名。我不知道..\cm ... onfig.cmm 做了什么。 只需像这样从 VBS 启动 t32mtc.exe:***.com/questions/1340355/… ARR,我已经回滚了您的最后一次编辑,您通过删除该信息所做的一切,就是让您的问题难以回答,并且我现有的答案提交与当时的问题不太相关回答。如果有什么特别导致您对我已经提供的一个或多个示例代码产生问题,并且您已经声明有效,请解释为对您的问题的编辑,而不是仅仅删除它的重要部分, (从而使我的答案不那么相关). 【参考方案1】:

要为最终用户使用 GUI 对话框来提供他们的 T32 目录,我会选择利用 PowerShell、JScript 或(您选择的)VBScript。

这是每个的快速和基本示例,(都没有写入文件)

batch-file 利用powershell:

@Set "T32_PATH="
@For /F Delims^=^ EOL^= %%G In ('^"
    "%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile ^
     "(New-Object -COM 'Shell.Application').BrowseForFolder(0,'Select your T32 directory.',1,0).Self.Path"
^"') Do @If Exist "%%G\t32mtc.exe" Set "T32_PATH=%%G"
@If Defined T32_PATH Start "" "%T32_PATH%\t32mtc.exe" …

batch-file 利用jscript:

0</* :
@Set "T32_PATH="
@For /F "Delims=" %%G In (
    '""%SystemRoot%\System32\cscript.exe" //E:JScript //NoLogo "%~f0" 2>Nul|Find /V """'
) Do @If Exist "%%G\t32mtc.exe" Set "T32_PATH=%%G"
@If Defined T32_PATH Start "" "%T32_PATH%\t32mtc.exe" …

@Exit /B */0;
var Folder=new ActiveXObject('Shell.Application').BrowseForFolder(0,'Select your T32 directory.',1,'0');
trynew ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(Folder.Self.Path);catch(e);close();

batch-file 利用vbscript:

<!-- :
@Set "T32_PATH="
@For /F "Delims=" %%G In (
    '"%SystemRoot%\System32\cscript.exe //NoLogo "%~f0?.wsf" 2>Nul|Find /V """'
) Do @If Exist "%%G\t32mtc.exe" Set "T32_PATH=%%G"
@If Defined T32_PATH Start "" "%T32_PATH%\t32mtc.exe" …

@Exit /B
-->
<Job><Script Language="VBScript">
Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0,"Select your T32 directory.",1,0)
WScript.Echo objFolder.Self.Path
</Script></Job>

为了希望更好地向您展示方法不会改变,这里有一个示例,它使用的结构更像您发布的示例的结构。

<!-- :
@Echo Off
SetLocal EnableExtensions DisabledelayedExpansion
Title Browse4Folder
Color 0A

:GetT32Parent
Set "T32_FILE=t32mtc.exe"
Set "T32_PATH="
Call :Browse4Folder "Select your T32 directory." "C:\scripts" "T32_PATH"
If Not Defined T32_PATH (Echo Error: Please try again.
    Pause
    GoTo GetT32Parent)
If Not Exist "%T32_PATH%\%T32_FILE%" (
    Echo The chosen directory does not contain %T32_FILE%.
    Echo Error: Please try again.
    Pause
    GoTo GetT32Parent)
Echo You have chosen this location "%T32_PATH%"
Pause
Rem Your T32 based code goes here.
Start "" "%T32_PATH%\%T32_FILE%" … 

Rem Any other code goes here.

Exit /B

:Browse4Folder
If "%~3" == "" (Set "sVariable=location") Else Set "sVariable=%~3"
If "%~2" == "" (Set "vRootFolder=%CD%") Else Set "vRootFolder=%~2"
If "%~1" == "" (Set "sTitle=Please select your directory.") Else Set "sTitle=%~1"
Set "%sVariable%="
For /F "Delims=" %%G In ('%SystemRoot%\System32\cscript.exe //NoLogo "%~f0?.wsf"
 "%sTitle%" "%vRootFolder%" 2^>Nul') Do Set "%sVariable%=%%G"
GoTo :EOF
-->
<Job><Script Language="VBScript">
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(0,WScript.Arguments.Item(0),0,WScript.Arguments.Item(1))
WScript.Echo objFolder.Self.Path
</Script></Job>

【讨论】:

非常感谢。此代码有助于打开 trace32 调试器,但 trace32 无法正常工作。 假设您已将我的示例中的 替换为您的其余命令参数,这与您的问题@AnkitaRayon 绝对无关。您的问题是关于从 GUI 对话框中获取输入目录,并将其作为参数传递给命令。这正是我的两个示例答案所做的!请阅读What should I do when someone answers my question?,了解在 *** 上接收答案时应考虑哪些选项。 感谢您的帮助。代码现在正在运行。非常感谢,如果我的任何 cmets 伤害了您,我们深表歉意。 如果代码对你有用@AnkitaRayon,你决定不接受我的回答有什么特别的原因吗? 是的,实际上你的代码太好了,说实话,我无法为我的教练辩护,因为你使用了 powershell 而我不熟悉它。

以上是关于如何在批处理文件中传递参数的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数(不是命令行参数)传递给批处理脚本中的函数

如何通过批处理文件执行 Python 代码并传递参数 - 使用 argparse

Windows 7批处理文件:如何检查参数是不是已传递给批处理文件

从带有命令行参数的批处理文件运行控制台应用程序,如何在运行时传递参数值? [复制]

如何传递运行时参数以从批处理文件启动 exe

如何对 Windows 10 批处理文件中的参数列表进行排序