2016-05-17 4 views
1

Я пытаюсь вызвать сценарий powershell из командного файла.powershell в файле командного файла как переменная

У меня есть следующие

for /F "usebackq delims=" %%a in (
    'PowerShell.exe -ExecutionPolicy ByPass -Command "(@(Select-String %QUERY% %FILE% -Context 0, 1 | % {$_.Context.PostContext}))"' 
) do set RESULT=%%a 

echo %RESULT% 

Но %RESULT% печатает всю команду не результат.

Все, что я пытаюсь сделать, это прочитать файл для флага, а затем возвращает следующую строку как %RESULT%

Я побежал следующее из командной строки

PowerShell.exe -ExecutionPolicy ByPass -Command "& (Select-String FAILED e:\path\to\app.log -Context 0, 1 | % {$_.Context.PostContext})" 

и получил этот

& : The term ':generic/generic.k4.csv' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of 
the name, or if a path was included, verify that the path is correct and try again. 
At line:1 char:3 
+ & (Select-String FAILED e:\path\to\app.log -Context 0 ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (:generic/generic.k4.csv:String) [], CommandNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

ответ

2

Проблема в вашем первом блоке кода заключается в использовании токена usebackq, все еще обертывая команду в одинарных кавычках, заставляя команду t o интерпретироваться как буквальная строка (которая затем помещается в %RESULT%). От for /?

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

Чтобы это исправить, либо обернуть команду в обратных кавычках (`) вместо одинарных ('), или удалить usebackq маркер из вашей команды.

Второй блок PowerShell не делает то же самое, что и первый. Синтаксис & (expr) оценивает выражение внутри круглых скобок и затем пытается его выполнить. В этом случае выполняется оценка вашего Select-String и возврат выбранной строки. PowerShell пытается выполнить извлеченную строку, как будто это команда. Это, вероятно, не то, что вы хотите.

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

+1

Он также должен избегать трубы с '^ |'. – SomethingDark

+0

@SomethingDark Обычно я согласен, но когда я запускал команду, она выполнялась правильно, не вырываясь из трубы. ¯ \\ _ (ツ) _/¯ –

+0

Я был [упрек до] (http://stackoverflow.com/questions/35962454/35962630#comment59585741_35962630) за то, что предложил кому-то избежать символа, который не был строго необходим парсер, поэтому я не собираюсь предлагать его снова, если я не уверен, что код не будет работать без него. –

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