2016-09-23 34 views
0

是否有可能将重定向指令存储在变量中?沿着这些线路的东西:将重定向指令移动到变量?

set redirect=>> buildlog.txt 2>&1 

nmake -f Makefile %redirect% 

因为,这是行不通的。

+0

你不得不将var分配放在引号中,因为否则重定向将被应用到'set'命令,而不是字符'2','>'等等......被分配为文本到变量。 –

+0

@MarcB你能提供一个可行的例子吗?我试过用引号,但它也不起作用... –

+0

我不完全理解你想要在你的buildlog.txt文件中。你想让buildlog.txt包含** set redirect = **吗? – Squashman

回答

2

由于>是shell元字符,因此不能直接使用它们来为变量指定文本。它们将被shell执行并且它们的RESULT被赋值。所以,你必须报/转义:

set redirect=^>^>buildlog.txt 2^>^&1 
      ^-^--etc... cmd uses^to escape. 

,然后工作,你希望:

C:\temp\z>set foo=^>^>log.txt 
C:\temp\z>dir %foo% 
C:\temp\z>dir 
Volume in drive C is Windows7_OS 
Volume Serial Number is 0E31-0E35 

Directory of C:\temp\z 

09/23/2016 10:32 AM <DIR>   . 
09/23/2016 10:32 AM <DIR>   .. 
09/23/2016 10:32 AM    333 log.txt 
       1 File(s)   333 bytes 
       2 Dir(s) 274,917,388,288 bytes free 

C:\temp\z>type log.txt 
Volume in drive C is Windows7_OS 
Volume Serial Number is 0E31-0E35 

Directory of C:\temp\z 

09/23/2016 10:32 AM <DIR>   . 
09/23/2016 10:32 AM <DIR>   .. 
09/23/2016 10:32 AM     0 log.txt 
       1 File(s)    0 bytes 
       2 Dir(s) 274,917,388,288 bytes free 
+0

完美,谢谢! –

+1

'set“redirect = >> buildlog.txt 2>&1”'(引用避免需要转义...) – aschipfl

0

你真正需要做的是利用延迟扩展。

@echo off 
set "redirect=>> buildlog.txt 2>&1" 

setlocal enabledelayedexpansion 
nmake -f Makefile !redirect! 
endlocal 
+0

这是另一种解决方案,谢谢! –

+0

不,这不起作用。一旦你正确地获得了变量中的'>'和'&',如果你想重定向起作用,就必须使用'%redirect%'。 – dbenham