1

WindowsXPマシンにnodejsをサイレントインストールするためのバッチファイルを作成しています。

ノードモジュールの依存関係のインストールを自動化しようとしています(npminstall)。

私は通常、ターゲットインストールディレクトリのcmdプロンプトからnpminstallを発行します。

バッチファイルからのコマンドプロンプトとの対話を自動化するのに苦労しています。

バッチスクリプトの次の行を使用すると、コマンドのテキストファイルをcmdにパイプ処理できるようになります。

for /F "usebackq delims=," %%i in ("c:\foo\source\npm_install.txt") do echo %%i | "c:\windows\system32\cmd.exe"

バッチファイルはc:\ foo\sourceにあります。c:\ foo\binから「npminstall」を発行する必要があります。

私のnpm_install.txtファイルがそのようなものである場合:

  cd /d c:\foo\bin,     
  npm install

cmdプロンプトは、ディレクトリをc:\からc:\ foo\binに変更する最初のコマンドを実行します。

次に、2番目のコマンドを実行しますが、c:\から再開します。ディレクトリを変更する前のコマンドは持続しません。テキストファイル内のすべてのコマンドはc:\から発行されるようです。

次に、組み合わせたステートメントから両方のコマンドを発行しようとしました。

  cd /d c:\foo\bin && npm install

このアプローチにより、以前のパスの問題を克服できるようですが、npmとinstallの間のスペースに問題があります。

cmdプロンプトはc:\ foo \ bin> npmを実行し、npmをスペースでトリップさせます。

コマンドを囲んでみましたが、成功しませんでした:'npm install'、 "npm install"、(npm install)。

誰かが私が間違っていることを教えてもらえますか?

ありがとう。

4

3 に答える 3

2

問題は、バッチ処理スクリプトが、インストールファイルの各行を処理するための新しいサブシェルを作成していることです。したがって、cdコマンドはサブシェルで実行され、その作業ディレクトリが変更されますが、その後、サブシェルが終了し、親シェルの作業ディレクトリに戻ります。

メインスクリプトは単にcallインストールスクリプト(拡張子を「.bat」に変更する必要があります)でしょうか?call同じシェルで別のバッチファイルを実行してから、元のスクリプトの実行を続行できます。

于 2012-09-08T14:56:59.943 に答える
1

これは必要ありません: do echo %%i | "c:\windows\system32\cmd.exe"。コマンドをブロックに入れるだけです。

do (
  command
  command
  ...
)

前のステートメントで、新しいcmdインタープリターを起動し、コマンドを実行して終了するように要求します。これが、その効果を失う理由ですcd

forループでトークンを指定しない場合、1番目のみが読み取られます。さらに、すべてのトークンは同じ行にある必要があります(表示する内容がフォーマットの副産物ではないかどうかはわかりません)"delims="。全行を読み取るために使用します。

次の必要がない場合は、コマンドと引数を混在させないでください。ファイルにディレクトリのみを配置する:

c:\ foo \ bin
c:\ bar \ bin

したがって、最終的には次のようになります(cdをpushd / popdに置き換えたので、最初に開始したのと同じディレクトリになります):

for /F "usebackq delims=" %%i in ("c:\foo\source\npm_install.txt") do (
      pushd %%i 
      npm install
      popd 
    )

編集:バッチ自体の場合、 ebohlmanが指摘npm installしたように、呼び出しを使用する必要があります

于 2012-09-08T15:00:36.960 に答える
0

注:これらの3つの例では、バッチファイルの前に配置する必要はなくCALL、その機能はそれぞれに組み込まれています。

最小で最も単純で、引数を指定してコマンドを実行するだけです。

@echo off
for /f "tokens=*" %%x in (c:\foo\source\npm_install.txt) do (
  call %%x
)

キーボードでコマンドを入力する人を模倣するには:

@echo off
for /f "tokens=*" %%x in (c:\foo\source\npm_install.txt) do (
  setlocal enabledelayedexpansion
    :: Mimic commandline
    call set "cmd=%%cd%%"
    echo !cmd!^>%%x
  endlocal
  :: Preform command
  call %%x
  echo.
)

スクリプトがどこで終了しても、開始したのと同じディレクトリに移動するには、次のようにします。

@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%x in (c:\foo\source\npm_install.txt) do (
    :: Mimic commandline
    call set "cmd=%%cd%%"
    echo !cmd!^>%%x
  :: Preform command
  call %%x
  echo.
)
endlocal
于 2012-09-08T22:12:20.200 に答える