2016-05-10 4 views
3

Я пытаюсь создать копию теневой копии из файла BATCH, но столкнулся с проблемой, которую я не могу объяснить.WMIC вызов в BATCH FOR команда Возвращает необъяснимую ошибку

При выполнении следующей команды:

FOR /F "tokens=3" %%A IN ('"WMIC shadowcopy call create ClientAccessible,"C:\""^| FIND /I "ShadowID"') DO SET ID=%%A 

Я получаю ошибку ниже

Invalid format. Hint <paramlist> = <param> [, <paramlist>].

, но если я заменю FIND с Findstr и удалить кавычки из вокруг слова Я ищу, что он работает правильно.

FOR /F "tokens=3" %%A IN ('"WMIC shadowcopy call create ClientAccessible,"C:\""^| FINDSTR /I ShadowID') DO SET ID=%%A 

Может кто-нибудь объяснить мне, почему первая команда не будет работать или что я с видом, чтобы сделать первую команду работать?

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

Благодаря значительно

+1

Не добавляйте часть командной строки 'wmic' (все слева от трубы) в' '' '', а затем избегайте ',' like '^,'. – aschipfl

+0

Спасибо, это то, что я пропускал. Я знал, что это просто. Очень признателен. – MTHome2010

ответ

0

Это происходит потому, что вывод команды WMCI в юникод. Смотрите этот пост Editing WMIC output format

+0

Это неверно, потому что ОП не приходит к этой точке из-за проблем, о которых я говорил в [моем ответе] (http://stackoverflow.com/a/37158106); как только проблемы синтаксиса будут устранены, необходимо учитывать проблему конвертации Unicode, которую вы упомянули ... – aschipfl

1

Есть две проблемы в вашем коде:

  1. Вы наткнулись на странное поведение FOR /F: он не только удалить одиночные кавычки (apostrophies, '') вокруг команды для синтаксического анализа, он также удаляет закрывающие кавычки, если первый и последний символы оставшейся строки равны " как , поэтому фактически выполняется попытка выполнить командную строку WMIC shadowcopy call create ClientAccessible,"C:\""| FIND /I "ShadowID, что является недействительным.
  2. Командная строка WMIC заключена в кавычки, поэтому даже если вышеуказанная проблема не была там, ваш код не будет работать, потому что интерпретатор команд пытается найти команду или программу с именем "WMIC shadowcopy call create ClientAccessible,", которая, конечно, не существует.

Так исправленное командная строка:

FOR /F "tokens=3" %%A IN ('WMIC shadowcopy call create ClientAccessible^,"C:\" ^| FIND /I "ShadowID"') DO SET "ID=%%A" 

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

1) Вы можете подтвердить, что, пытаясь командную строку FOR /F "tokens=3" %%A IN ('"WMIC" shadowcopy call create ClientAccessible^,"C:\" ^| FIND /I "ShadowID"') DO SET "ID=%%A", которая терпит неудачу, и FOR /F "tokens=3" %%A IN ('^""WMIC" shadowcopy call create ClientAccessible^,"C:\" ^| FIND /I "ShadowID"^"') DO SET "ID=%%A", который работает, потому что есть дополнительные "" ставить вокруг (они убежали, как ^" так, что командная строка не должна быть измененный с точки зрения выхода, вы также можете указать буквально, но тогда вам нужно было освободить , и |).


Кроме того, я рекомендую гнездо другого FOR /F цикл внутри вашего, потому что WMIC возвращает текст Unicode, который может оставить артефакты (осиротевший возврат каретки символов) при разбираемом на FOR /F (как он ожидает, ANSI текста); дополнительная фаза синтаксического анализа устраняет такой шум:

FOR /F "tokens=3" %%A IN ('WMIC shadowcopy call create ClientAccessible^,"C:\" ^| FIND /I "ShadowID"') DO FOR /F "delims=" %%B in ("%%A") DO SET "ID=%%B" 

Этот метод зачисленных dbenham - видеть его ответ на Why is the FOR /f loop in this batch script evaluating a blank line?, а также его внешний статью WMIC and FOR /F : A fix for the trailing <CR> problem.

 Смежные вопросы

  • Нет связанных вопросов^_^