我试图让一个批处理文件从dropbox读取文本文件并将其作为批处理文件中的变量执行。
这就是我正在尝试的,但它不起作用,请帮忙!
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%
会起作用。另一种选择是使用延迟扩展。 <{1}}和SETLOCAL EnableDelayedExpansion
可以根据需要包含在内容中。
您不能在内容中ENDLOCAL
或CALL
GOTO
。
目前我记得这一切,但可能有(可能是)其他限制。
我有一个问题:
如果内容已经在文本文件中,那么为什么不简单地为文本文件提供.BAT扩展名并执行呢?