захват списка параметров командного файла CMD;записать в файл для дальнейшей обработки - PullRequest
2 голосов
/ 02 мая 2010

Я написал командный файл, который запускается программой как программа постобработки. Пакетный файл читает ~ 24 параметра, предоставленных вызывающей программой, сохраняет их в переменные и затем записывает их в различные текстовые файлы.

Поскольку максимальная входная переменная в CMD равна% 9, необходимо использовать команду 'shift', чтобы многократно читать и сохранять их по отдельности в именованных переменных. Поскольку программа выводит несколько похожих пакетных файлов, в результате последовательно открываются несколько окон CMD, назначаются переменные и записываются файлы данных. Это слишком долго связывает вызывающую программу.

Мне приходит в голову, что я мог бы освободить вызывающую программу намного быстрее, если, возможно, есть способ написать очень простой командный файл, который может записать все параметры команды в текстовый файл, где я смогу обработать их позже. По сути, просто возьмите список параметров, напишите его и готово.

В: Есть ли способ обработать всю серию данных параметров как одну большую текстовую строку и записать ее в одну большую переменную ... и затем отобразить всю большую вещь в одном текстовом файле? Затем прочитайте строку в% n переменных, когда нет программы, ожидающей возобновления?

Список параметров - что-то вроде 25 - 30 слов, не более 200 символов.

Пример списка параметров:
«Имя» «Фамилия» «123 Steet Name Way» «Имя города» ST 12345 1004968 01.06.2010 «Имя + Фамилия» 101738 «На счету» 20,67 xy-1z 1 8,95 3,00 1,39 0 0 239 8,95

Элементы в кавычках обрабатываются как строковые переменные. Список разделен пробелом.

Есть предложения?

Ответы [ 2 ]

5 голосов
/ 09 января 2012
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

1 голос
/ 26 февраля 2014

Интересный пост. Это вызвало мой интерес.

Мне тоже нужно что-то, что могло бы принимать параметры, и, хотя это, вероятно, сейчас бесполезно для вас, я подумал, что это может быть полезно позже.

Мое решение менее простое - потому что не существует элегантного способа сделать это.

По сути, в этом примере «-» может использоваться для идентификации параметра, а следующий пробел предполагается равным значению.

Юридические материалы:

Так что это весь мой код, и мне все равно, как и где вы решите его использовать. Нет необходимости цитировать меня, это всего лишь пример.

Как это:

Пакет Microsoft: начните копирование ниже и сохраните как filename.bat

 <code></p>

<pre><code>@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%

Microsoft Batch END Copy

РЕЗУЛЬТАТЫ:

__CURRENT_WORKING_DIRECTORY __ = C: \ DEV \ а \ выигрыш \ Sysprep \ работает ...: - RUN_FUNCTION VARPASSED1 был "Бегом ..." VARPASSED2 был "Это ..." Мы получили следующие результаты ... PACKAGING_JOB_NAME = "Запуск этой работы" PACKAGING_BUILD_NUMBER = "1.2.3 build 405" RUN_COMMAND = RUN_FUNCTION
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...