запустить входной параметр как команду в пакетном скрипте dos? - PullRequest
1 голос
/ 22 февраля 2012

Как мне запустить команду в моем скрипте dos из входного аргумента?

Упрощенный скрипт bla.bat:
ВЫЗОВ% 1

Назовите это:
bla.bat "echo 'hello'" (или bla.bat "git status")

Ошибка:
«git status» не распознается как внутренняя или внешняя команда, работающая программа или командный файл.

Это работает, если я делаю "CALL git status".

Ответы [ 4 ]

3 голосов
/ 22 февраля 2012

Важно помнить, что расширенный текст должен выглядеть точно так же, как если бы вы просто вводили команду из командной строки.(на самом деле есть несколько исключений, но это хорошая отправная точка).

Чтобы отладить ваш скрипт, просто поставьте echo перед вашим вызовом: @echo call %1.Теперь попробуйте запустить, как вы делали ранее: blah.bat "echo 'hello'" производит call "echo 'hello'".Попробуйте запустить это из командной строки - это не работает.Вы хотите, чтобы call echo 'hello'.

Одним из исправлений было бы небольшое изменение вашего сценария: модификатор ~ удаляет заключающие в кавычки аргументы

@echo off
call %~1

Или вы можете отказаться отвызовите и просто используйте следующее (если вы не вызываете другой пакетный файл, из которого вы хотите вернуть)

@echo off
%~1

Если в командной строке нет других аргументов, вам лучше использовать%*, который распространяется на все аргументы

@echo off
%*
REM or call %*

Теперь вы можете называть свой пакет следующим образом:

blah.bat echo "hello"

Имейте в виду, что пакет имеет все виды особых странностей, которые, вероятно, потребуютдополнительное или другое кодирование для обхода.Слишком много, чтобы перечислить - просто ожидайте неожиданного.

2 голосов
/ 22 февраля 2012

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

%~1, который удалит любые окружающие кавычки из ввода.

%~$PATH:1, который обрезает любые окружающие кавычки, затем ищет в $ PATH env-var первое совпадение, затем расширяет строку, чтобы включить полный путь к команде, которая не будет работать для git с использованием дистрибутива Windows потому что git это командный файл, а cmd будет искать git status.bat

Если он будет использоваться с git, вы также можете использовать% ~ 1 и% ~ 2 для вызова git, а затем предоставить аргумент в пакетный файл git или напрямую вызвать git.exe, изменив свой $ PATH. Но помните, что git.bat самостоятельно выполняет настройку среды перед вызовом самого git.

1 голос
/ 22 февраля 2012

Я думаю, вам понадобится %1% для отображения параметров. Вот мой отсталый скрипт, который, я думаю, делает то, что вы хотите, работает с вашим echo тестом:

    bla echo hello

Дает:

    C:\tmp>echo bla
    bla

    C:\tmp>echo echo
    echo

    C:\tmp>CALL echo hello
    hello        

    echo %0%
    echo %1%
    CALL %*

Если вы хотите разобрать аргументы командной строки, дайте мне знать.

0 голосов
/ 22 февраля 2012

Проблема в том, что пробелы между параметрами отбрасывают вас (именно поэтому вы использовали кавычки вокруг состояния git).

Измените ваш bla.bat, чтобы выполнять итерации по параметрам командной строки.Это работает для меня:

SETLOCAL ENABLEDELAYEDEXPANSION

SET VAR1=

FOR %%A IN (%*) DO (
  SET VAR1=!VAR1! %%A
)

call %VAR1%

ENDLOCAL

Затем запустите ваш bla.bat без кавычек вокруг состояния git.

bla git status

По сути, это выполняется через параметры командной строки,а затем выполняет их все как одну команду.Проблема заключается в том, что циклы FOR в DOS не позволяют использовать переменную, которую вы устанавливаете внутри себя, поэтому вам необходимо включить «отложенное расширение» переменных.Затем переменная, которую вы устанавливаете, должна быть заключена в восклицательные знаки (не в%).И, конечно же, пространство между! VAR1!и %% A не позволяет параметрам работать вместе в CALL.

...