2016-05-17 82 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)暗示有人逃脱一个字符,并非严格要求的解析器,所以我不打算再次提出它,除非我确定没有它的代码将无法正常工作。 –