0

我正在尝试让批处理文件从保管箱中读取文本文件并将其作为批处理文件中的变量执行。

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

SetLocal EnableDelayedExpansion
set content=

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

content! %%i

%content%
EndLocal
4

1 回答 1

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,否则无法使用普通扩展来扩展变量。例如,行 likeecho %var%不会起作用,但call echo %var%会起作用。另一种选择是使用延迟扩展。SETLOCAL EnableDelayedExpansion并且ENDLOCAL可以根据需要包含在内容中。

  • 您不能CALLGOTO:LABEL内容中。

这就是我目前能记住的全部内容,但可能(可能有)其他限制。

我有一个问题:

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

于 2012-06-23T16:52:25.110 回答