2012-06-23 40 views
0

我试图从批处理文件中读取文本文件并将其作为批处理文件中的变量执行。有一个批处理文件从保存箱中读取文本文件,并将其作为变量在批处理文件中执行

这是我正在尝试,但它不起作用,请帮助!

SetLocal EnableDelayedExpansion 
set content= 

for /F "delims=" %%i in (DROPBOX-LINK-HERE) do set content=! 

content! %%i 

%content% 
EndLocal 
+0

我并不完全确定自己很清楚你想要做什么。您能否请您发布一个文本文件样本,然后指定您希望执行此批处理脚本的结果? –

回答

2

我不确定你的意思是DROPBOX-LINK-HERE,但我使用普通的文本文件作为内容。

您必须将每行与&分隔开,否则将内容括在括号内,并将每行与<linefeed>分开。换行解决方案更复杂,但对内容的限制更少。

任何!如果启用延迟扩展,则在FOR变量扩展期间内容中的字符将被破坏。但需要延迟扩展才能保留未引用的特殊字符。所以延迟扩展需要创造性地开关。

这里是代码,我认为做你想做的。

@echo off 
setlocal disableDelayedExpansion 

::Define a carriage return variable 
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a" 

::Create a newline variable 
set LF=^ 


::The above 2 blank lines are critical - do not remove 

::Both CR and LF should be expanded using delayed expansion only. 

::Load the content into a variable. 
::We want to separate lines with linefeed, but FOR /F won't preserve linefeeds. 
::So use carriage return as a place holder for now. 
set "content=(" 
setlocal enableDelayedExpansion 
for /f %%C in ("!CR! ") do (
    endlocal 
    for /f "delims=" %%A in (test.txt) do (
    setlocal enableDelayedExpansion 
    for /f "delims=" %%B in ("!content!") do (
     endlocal 
     set "content=%%B%%C%%A" 
    ) 
) 
) 

::Now replace carriage returns with newline and append terminating) 
setlocal enableDelayedExpansion 
for /f %%C in ("!CR! ") do for %%N in ("!LF!") do set "content=!content:%%C=%%~N!%%~N)" 

::Execute the content 
endlocal&%content% 

该代码有效,但是可以从变量执行的代码类型存在限制。

  • 除非您使用CALL,否则变量不能通过正常扩展进行扩展。例如,像echo %var%这样的行将不起作用,但call echo %var%将起作用。另一种选择是使用延迟扩展。根据需要可以将SETLOCAL EnableDelayedExpansionENDLOCAL包含在内容中。

  • 您不能在CALLGOTO a :LABEL之内的内容。

这就是我现在所记得的,但可能有(可能是)其他限制。

我有一个问题,但:

如果内容已经在一个文本文件,那么为什么不干脆放弃了文本文件.bat扩展名并执行它?

+0

+1(与往常一样)有时真的存在简单的说明:-)'为什么不简单地给文本文件一个.BAT扩展名并执行它呢?但你的解决方案更先进...... – jeb

相关问题