让批处理文件从dropbox读取文本文件,并将其作为批处理文件中的变量执行

时间:2012-06-23 13:53:54

标签: batch-file

我试图让一个批处理文件从dropbox读取文本文件并将其作为批处理文件中的变量执行。

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

SetLocal EnableDelayedExpansion
set content=

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

content! %%i

%content%
EndLocal

1 个答案:

答案 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可以根据需要包含在内容中。

  • 您不能在内容中ENDLOCALCALL GOTO

目前我记得这一切,但可能有(可能是)其他限制。

我有一个问题:

如果内容已经在文本文件中,那么为什么不简单地为文本文件提供.BAT扩展名并执行呢?