32

Windows で *.bat 拡張子なしでバッチ スクリプトを実行できる方法はありますか?

4

6 に答える 6

22

これは私にとって興味深いトピックです!それについていくつかの観察をしたいと思います。

最初の重要なポイント: バッチ ファイルは、.BAT または .CMD 拡張子を持つファイルです。限目。バッチ ファイルは、通常の DOS コマンドの実行に加えて、特定のバッチ ファイル機能、特に次の機能を実行できます。

  • %1 %2 ... および SHIFT コマンドの実行によるバッチ ファイル パラメータへのアクセス。
  • GOTO コマンドの実行。
  • CALL :NAME コマンドの実行 (内部サブルーチン)。
  • SETLOCAL/ENDLOCAL コマンドの実行。

ここで面白いのは、どのファイルも CMD.exe の入力としてリダイレクトできるため、そこに含まれる DOS コマンドはバッチ ファイルと同様の方法で実行されますが、いくつかの違いがあります。最も重要なことは、以前のバッチファイル機能が機能しないことです。別の違いは、以下の NOT-Batch ファイルに示されています (私はそれを BATCH.TXT と呼びました)。

@echo off
rem Echo off just suppress echoing of the prompt and each loop of FOR command
rem but it does NOT suppress the listing of these commands!

rem Pause command does NOT pause, because it takes the character that follows it
pause
X

rem This behavior allows to put data for a SET /P command after it
set /P var=Enter data: 
This is the data for previous command!
echo Data read: "%var%"

rem Complex FOR/IF commands may be assembled and they execute in the usual way:
for /L %i in (1,1,5) do (
   set /P line=
   if "!line:~0,6!" equ "SHOW: " echo Line read: !line:~6!
)
NOSHOW: First line read
SHOW: Second line
NOSHOW: This is third line
SHOW: The line number 4
NOSHOW: Final line, number five

rem You may suppress the tracing of the execution redirecting CMD output to NUL
rem In this case, redirect output to STDERR to display messages in the screen
echo This is a message redirected to STDERR >&2

rem GOTO command doesn't work:
goto label
goto :EOF
rem but both EXIT and EXIT /B commands works:
exit /B

:label
echo Never reach this point...

前のファイルを実行するには、次のように入力します。 CMD /V:ON < BATCH.TXT 遅延展開を有効にするには、/V スイッチが必要です。

より特殊な違いは、NOT-Batch ファイル内のコマンドがコマンド ライン コンテキストで実行され、バッチ ファイル コンテキストでは実行されないという事実に関連しています。おそらく、Dave または Jeb がこの点について詳しく説明することができます。

編集: 追加の観察(batch2.txt):

@echo off
rem You may force SET /P command to read the line from keyboard instead of
rem from following lines by redirecting its input to CON device.

rem You may also use CON device to force commands output to console (screen),
rem this is easier to write and read than >&2

echo Standard input/output operations> CON
echo/> CON
< CON set /P var=Enter value: > CON
echo/> CON
echo The value read is: "%var%"> CON

この方法で前のファイルを実行します: CMD < BATCH2.TXT > NUL

EDITさらに追加の観察(batch3.txt)

@echo off

rem Dynamic access to variables that usually requires DelayedExpansion via "call" trick

rem Read the next four lines; "next" means placed after the FOR command
rem (this may be used to simulate a Unix "here doc")

for /L %i in (1,1,4) do (
   set /P line[%i]=
)
Line one of immediate data
This is second line
The third one
And the fourth and last one...

(
echo Show the elements of the array read:
echo/
for /L %i in (1,1,4) do call echo Line %i- %line[%i]%
) > CON

このファイルを通常の方法で実行します: CMD < BATCH3.TXT > NUL

面白い!ではない?

編集: これで、GOTO および CALL コマンドが NotBatch.txt ファイルでシミュレートされる可能性があります!!! この投稿を参照してください。

アントニオ

于 2012-11-12T02:20:21.623 に答える
5

Just use:

type mybat.txt | cmd

Breaking it down...

type mybat.txt reads mybat.txt as a text file and prints the contents. The | says capture anything getting printed by the command on its left and pass it as an input to the command on its right. Then cmd (as you can probably guess) interprets any input it receives as commands and executes them.

In case you were wondering... you can replace cmd with bash to run on Linux.

于 2020-08-30T18:42:44.417 に答える
0

はい、可能かもしれませんが、おそらく簡単な方法ではありません=)まず第一に..セキュリティを引き起こします。数年前と数か月前に同じことをしようとしましたが、解決策が見つかりませんでした..

execu.cmd

type toLaunch.txt >> bin.cmd
call bin.cmd
pause > nul
exit

次にtoLaunch.txtに入れます

@echo off
echo Hello!
pause > nul
exit

例として、コードを「コンパイル」し、「出力」ファイル、つまり「解析」を実行します。

解析する代わりに、名前を変更して使用し、toLaunch.txt 内を使用してスクリプト内に自動名前変更を入れることもできます。

ren %0 %0.txt

それが役に立ったことを願っています!

于 2015-05-28T00:03:50.477 に答える
-1

変数を呼び出し元のバッチ ファイルにエクスポートする場合は、次を使用できます。

for /F "tokens=*" %%g in (file.txt) do (%%g)

このメソッドにはいくつかの制限があります (コメントには使用しないでください::) が、構成ファイルには最適です。

例:

rem Filename: "foo.conf"
rem 
set option1=true
set option2=false
set option3=true
@echo off
for /F "tokens=*" %%g in (foo.conf) do (%%g)
echo %option1%
echo %option2%
echo %option3%
pause
于 2020-11-23T09:16:25.990 に答える