【问题标题】:capturing CMD batch file parameter list; write to file for later processing捕获 CMD 批处理文件参数列表;写入文件以供以后处理
【发布时间】:2011-02-14 16:21:45
【问题描述】:

我编写了一个批处理文件,它由程序作为后处理实用程序启动。批处理文件读取调用程序提供的约 24 个参数,将它们存储到变量中,然后将它们写入各种文本文件。

由于 CMD 中的最大输入变量是 %9,因此有必要使用“shift”命令重复读取这些变量并将其分别存储到命名变量中。因为程序输出了几个类似的批处理文件,结果是依次打开几个CMD窗口,分配变量和写入数据文件。这会占用调用程序太长时间。

我突然想到,如果有一种方法可以编写一个非常简单的批处理文件,可以将所有命令参数写入一个文本文件,我以后可以在其中处理它们,那么我可以更快地释放调用程序。基本上,只要抓取参数列表,写完就可以了。

问:有没有办法将整个系列的参数数据视为一个大文本字符串并将其写入一个大变量......然后将整个大数据回显到一个文本文件?然后在没有程序等待恢复时将字符串读入 %n 个变量?

参数列表大概是 25 - 30 个字,少于 200 个字符。

示例参数列表:
"名字" "姓氏" "123 Steet Name Way" "城市名" ST 12345 1004968 06/01/2010 "名字+姓氏" 101738 "帐户上" 20.67 xy-1z 1 8.95 3.00 1.39 0 0 239 8.95

引号中的项目作为字符串变量处理。列表以空格分隔。

有什么建议吗?

【问题讨论】:

  • 我想我不明白你在这里尝试什么。 24×shift 和变量赋值应该几乎是瞬间发生的。如果您不想等待批处理文件,则可以将这些内容直接从程序中写入文本文件。或者只是预先设置环境变量,如果你想避免shift 和变量赋值。如果批处理文件不需要按顺序运行,您也可以异步启动它们。至于您的问题,您可以使用for /f 进行标记,但由于引号或子例程,这很痛苦;但这会让你从你开始的地方开始
  • 谢谢你,Johannes:我做了更多研究,发现了一个看似简单的解决方案。我将整个参数集视为一个字符串变量......所以整个事情作为 %1 变量到达。我将其写入命名变量,然后将其写入文本文件。这为我提供了随后需要通过字符串操作处理的数据。我很感激你的回应。很有帮助。

标签: variables parameters cmd


【解决方案1】:
echo %* 1>args.txt

%* 引用所有参数:%1 %2 %3...

它也适用于子例程。

call :test 1 2 3
goto :eof

:test
echo 1: %1
echo 2: %2
echo 3: %3
echo *: %*
exit /b

输出:

1: 1
2: 2
3: 3
*: 1 2 3

有关详细信息,请参阅以下网站: http://ss64.com/nt/syntax-args.html

【讨论】:

    【解决方案2】:

    有趣的帖子。这引起了我的兴趣。

    我也需要一些可以接受参数的东西,虽然现在这可能对你没有用,但我认为以后可能会有用。

    我的解决方案不那么简单 - 因为没有一种优雅的方式来做到这一点。

    基本上,在这个例子中,“-”可以用来标识一个参数,并且假设下一个空格被设置为一个值。

    法律规定:

    所以这是我所有的代码,我真的不在乎你选择如何或在哪里使用它。无需引用我,这只是一个例子。

    像这样:

    Microsoft Batch:Begin Copy below and save as filename.bat

     
    
    
    @ECHO OFF
    REM USAGE: this-batch-name.bat -BUILD "1.2.3 build 405" -JOB "Running This Job" -run RUN_FUNCTION
    SET __CURRENT_WORKING_DIRECTORY__=%~dp1
    ECHO.__CURRENT_WORKING_DIRECTORY__=%__CURRENT_WORKING_DIRECTORY__%
    
    REM # Clear Previous Variables
    SET PACKAGING_BUILD_NUMBER=
    SET PACKAGING_JOB_NAME=
    SET GO_DEEPER=
    SET RUN_COMMAND=
    
    REM ## In order to read variables set while in a "FOR" loop
    REM ##  you have to set the 'ENABLEDELAYEDEXPANSION' with 'SETLOCAL'.
    
    SETLOCAL ENABLEEXTENSIONS
    SETLOCAL ENABLEDELAYEDEXPANSION
    
    REM ## Capture Command line parameters here with a %*
    FOR %%A IN (%*) DO (
        REM ## If we found something with a '-' in previous pass run GO_DEEPER will be defined and thus set to the command line argument.
        IF DEFINED GO_DEEPER (
            REM ## When ENABLEDELAYEDEXPANSION is Set with setlocal command you have to use exclamation: i.e. '^!'
            IF /I "-BUILD"=="!GO_DEEPER!" SET PACKAGING_BUILD_NUMBER=%%A
            IF /I "-JOB"=="!GO_DEEPER!" SET PACKAGING_JOB_NAME=%%A
            IF /I "-RUN"=="!GO_DEEPER!" SET RUN_COMMAND=%%A
            SET SET GO_DEEPER=
        )
        IF /I "%%A" GEQ "-" (
            REM ## Wow we found your command line argument that started with a '-' so set the GO_DEEPER Var
            SET GO_DEEPER=%%A
        ) ELSE (
            SET SET GO_DEEPER=
        )
    )
    REM ## Time to grab the variables set while in delayed expansion mode
    ENDLOCAL && SET PACKAGING_BUILD_NUMBER=%PACKAGING_BUILD_NUMBER% && SET PACKAGING_JOB_NAME=%PACKAGING_JOB_NAME% && SET RUN_COMMAND=%RUN_COMMAND%
    
    REM ## Sucks, but you have to clear the '"' and "'" if it exists. 
    IF DEFINED RUN_COMMAND (
        SET RUN_COMMAND=%RUN_COMMAND:"=%
        SET RUN_COMMAND=%RUN_COMMAND:'=%
    )
    IF DEFINED PACKAGING_JOB_NAME (
        SET PACKAGING_JOB_NAME=%PACKAGING_JOB_NAME:"=%
        SET PACKAGING_JOB_NAME=%PACKAGING_JOB_NAME:'=%
    )
    IF DEFINED PACKAGING_BUILD_NUMBER (
        SET PACKAGING_BUILD_NUMBER=%PACKAGING_BUILD_NUMBER:"=%
        SET PACKAGING_BUILD_NUMBER=%PACKAGING_BUILD_NUMBER:'=%
    )
    REM ## Now we can try to run the command  function if the -run was used...
    IF DEFINED RUN_COMMAND (
        CALL:--%RUN_COMMAND% "'%PACKAGING_JOB_NAME%'","'%PACKAGING_BUILD_NUMBER%'"
    ) ELSE (
        ECHO Try running:
        ECHO %0 -BUILD "1.2.3 build 405" -JOB "Running This Job" -run RUN_FUNCTION
    )
    
    GOTO DONE
    
    :--RUN_FUNCTION
    ECHO running... %~0
    SET VARPASSED1=%~1
    SET VARPASSED2=%~2
    IF DEFINED VARPASSED1 ECHO VARPASSED1 was %VARPASSED1%
    IF DEFINED VARPASSED2 ECHO VARPASSED2 was %VARPASSED2%
    ECHO Add your code to process here...
    
    GOTO:EOF
    
    :DONE
    ECHO We got the following results...
    IF DEFINED PACKAGING_JOB_NAME ECHO PACKAGING_JOB_NAME=%PACKAGING_JOB_NAME%
    IF DEFINED PACKAGING_BUILD_NUMBER ECHO PACKAGING_BUILD_NUMBER=%PACKAGING_BUILD_NUMBER%
    IF DEFINED RUN_COMMAND ECHO RUN_COMMAND=%RUN_COMMAND%
    </pre> </code>
    

    Microsoft Batch END Copy

    RESULTS:

    __CURRENT_WORKING_DIRECTORY__=C:\dev\a\win\sysprep\ running... :--RUN_FUNCTION VARPASSED1 was "'Running...'" VARPASSED2 was "'This...'" We got the following results... PACKAGING_JOB_NAME="Running This Job" PACKAGING_BUILD_NUMBER="1.2.3 build 405" RUN_COMMAND=RUN_FUNCTION

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      相关资源
      最近更新 更多