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 を使用しない限り、通常の展開を使用して変数を展開することはできません。たとえば、次のような行echo %var%は機能しませんが、機能しcall echo %var%ます。もう 1 つのオプションは、遅延展開を使用することです。SETLOCAL EnableDelayedExpansion必要にENDLOCAL応じてコンテンツに含めることができます。

  • コンテンツ内でまたはCALLするGOTOことはできません。:LABEL

現時点で覚えているのはこれだけですが、他にも制限がある可能性があります (おそらくあります)。

ただし、1 つ質問があります。

コンテンツが既にテキスト ファイルにある場合は、単にテキスト ファイルに .BAT 拡張子を付けて実行してみませんか?

于 2012-06-23T16:52:25.110 に答える