2016-12-13 18 views
-1

私は同じフォルダからMSIファイルからいくつかのアプリケーションをインストールするバッチスクリプトを書いています。手動で実行されるバッチスクリプトのコマンドが「認識されない」のはなぜですか?

これらのコマンドをコマンドプロンプトウィンドウに書き込むと、すべて正常であり、すべてのコマンドが正しく機能します。私は、バッチスクリプトにそれらを書くとき

しかし、突然のコマンドのほとんどは、以下のようなXCOPYmsiexecは、のようなエラーメッセージにDISM結果:

「XCOPYは」は、内部または外部として認識されませんコマンド、操作可能なプログラムまたはバッチファイル。

しばらくの間、それをグーグル後、私はC:\Windows\system32が含まれている必要があり、環境変数PATHに関連した多くのコメントを見て、私はPATHに含まれてを確認しました。私がすでに試したフルパスを書くことについての多くの答えが見つかりましたが、うまくいきませんでした。

私は2012年

これは私のバッチファイルのコードでWindowsサーバ上で働いている:

@echo off 
set path=C:\    rem default path 
rem get the path as parameter to the script: 
set argC=0 
for %%x in (%*) do Set /A argC+=1 
if %argC% gtr 0 (set path=%1%) 
IF %ERRORLEVEL% NEQ 0 (
    echo %me%: something went wrong with input directory 
) 
echo Destenation: %path% 

SETLOCAL ENABLEEXTENSIONS 
SET me=%~n0 
SET parent=%~dp0 
echo %me%: starting installation of Python 2.7 64bit and Apache 64 bit 
REM install .net 3.5 
DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:installationMediaDrive:\sources\sxs 
msiexec /i ".\py\python-2.7.amd64.msi" TARGETDIR=%path%/Python27 /passive /norestart ADDLOCAL=ALL 
mkdir %path%\Apache24 
XCOPY /e /Q ".\Apache24" %path%\Apache24 
+5

私たちにあなたのコードを教えてください –

+0

ねえ、responeのおかげで、私はコードを追加 – Poly

答えて

0

それはのように最初のインストールディレクトリに、必要に応じて指定されたパスをサポートしている必要があり、バッチファイルのように見えますパラメータ。このオプションのフォルダパスが存在するかどうかをチェックするコードは非常に混乱します。以下に見られるように、オプションのパラメータをチェックする確実な方法があります。

主な問題は、バッチファイルの実行時にコマンドインタプリタcmd.exeによってもはや検出されないディレクトリ%SystemRoot\System32および他の標準のWindowsディレクトリに保存されているのWindowsの標準コンソールアプリケーションにつながる環境変数PATHを再定義しています。

一般にフルパス、ファイル名、ファイル拡張子をダブルクォートで囲んで実行するアプリケーションを指定する必要があります。この完全なファイル指定文字列には、最後に説明したような空白文字またはこれらの文字のいずれかが含まれています。コマンドプロンプトウィンドウcmd /?で実行中の最終出力ヘルプページの段落。

しかし、コマンドプロンプトウィンドウ内から手動でアプリケーションやスクリプトを手動で実行できるようにするため、Windowsコマンドインタープリタは、パスやファイル拡張子を指定しないと、アプリケーションまたはスクリプトが単独で実行されることもあります。だから、

環境変数PATHEXT現在のディレクトリ内の最初のセミコロン区切りリストで定義されているファイル拡張子を持つパターンxcopy.*にマッチするファイルをユーザーがちょうどxcopyに入るか、バッチファイルがちょうどxcopyが含まれている、Windowsコマンドインタープリタを検索場合セミコロンで区切られた環境変数PATHのリスト内のすべてのディレクトリで次に適切なファイルが見つからない場合。

は3つの環境変数PATHあります

  1. システムの下で、Windowsのレジストリに保存されているようPATHシステムに

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 
    

    フォルダパスPATHは、デフォルトで使用されていますすべてのプロセスは使用されたアカウントに依存しません。

  2. ユーザーの下で、Windowsのレジストリに保存されているようPATHユーザーに

    HKEY_LOCAL_MACHINE\Environment 
    

    フォルダパスPATHだけのアカウントを使用して、実行中のすべてのプロセスのためにデフォルトで使用されているユーザーPATHを設定した。

  3. ローカルPATHは、現在実行中のプロセスのアクティブな環境でのみ保持されます。

システムユーザPATHを処理するための単一ローカルPATHにWindowsによって連結されています。

バッチファイルの実行のためにWindowsコマンドインタープリタを起動するWindowsエクスプローラのような新しいプロセスがプロセスによって開始されるたびに、現在実行中のプロセスの環境テーブルのコピーが新しいプロセス用に作成されます。したがって、環境変数のローカルコピーでプロセスが変更されても、すでに実行されている他のすべてのプロセスに影響はありません。環境変数のローカル変更は、独自のプロセスと、その変数を変更するプロセスによって開始されたすべてのプロセスに対してのみ有効です。

コマンドset PATHPATH大文字と小文字を区別しないで始まるすべての変数をリストアップしたバッチファイルを起動時に使用される変数PATHPATHEXTは、コマンドプロンプトウィンドウで実行されているに表示された値は、同じユーザーアカウントで開かれているバッチファイルを起動するには名前で。

今、私たちは、バッチファイルの2行目に見てみましょう:

set path=C:\    rem default path 

この行は、ローカルPATH環境変数を再定義します。したがって、環境変数PATHは、バッチファイルを実行するコマンドプロセスに有効であり、このバッチファイルによって開始されたすべてのアプリケーションは、もはやC:\Windows\System32;C:\Windows;...を含みませんが、この非常に奇妙な単一のフォルダパスを含みます。

C:\    rem default path 

remcmd.exeの内部コマンドであり、別の行に書き込まれなければなりません。C++やJavaScriptでは//のようなバッチコードで行コメントは使用できません。このコマンドのヘルプについては、コマンドプロンプトウィンドウrem /?で実行してください。

最初の引数としてインストールフォルダパスなしでバッチファイルを実行するには、スペース/たくさんの名前rem default pathとはディレクトリが確実に存在しないとして、結果は単に現在のディレクトリにdism.*msiexec.*xcopy.*のためのWindowsコマンドインタープリタを検索していることですドライブC:のルートの先頭にタブがあります。

結論:インストールフォルダパスの変数名にpathを使用することはお勧めできません。

バッチコードのもう一つの間違いは、%1%を使用してバッチファイルの最初の引数を指定していることです。バッチファイルの引数がどの可能性のドライブとパスを取得するには、以下の使用%~dp0のように存在してバッチファイルとの参照引数に%1は、%2は、...ヘルプは、コマンドプロンプトウィンドウcall /?で実行して参照されているので、これは間違っています引数0はバッチファイル名、つまり現在実行中のバッチファイルを含むフォルダのパスです。使用するコマンドを理解するための

@echo off 
setlocal EnableExtensions 
set "SourcePath=%~dp0" 
set "BatchName=%~n0" 
if "%~1" == "" (
    echo %BatchName% started without an installation folder path. 
    set "InstallPath=C:\" 
    goto StartInstalls 
) 

rem Get installation folder path from first argument 
rem of batch file without surrounding double quotes. 
set "InstallPath=%~1" 

rem Replace all forward slashes by backslashes in case of installation 
rem path was passed to the batch file with wrong directory separator. 
set "InstallPath=%InstallPath:/=\%" 

rem Append a backslash on installation path 
rem if not already ending with a backslash. 
if not "%InstallPath:~-1%" == "\" set "InstallPath=%InstallPath%\" 

:StartInstalls 
echo %BatchName%: Installation folder: %InstallPath% 

echo/ 
echo %BatchName%: Installing .NET 3.5 ... 
DISM.exe /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:installationMediaDrive:\sources\sxs 

echo/ 
echo %BatchName%: Installing Python 2.7 64-bit ... 
%SystemRoot%\System32\msiexec.exe /i "%SourcePath%py\python-2.7.amd64.msi" TARGETDIR="%InstallPath%Python27" /passive /norestart ADDLOCAL=ALL 

echo/ 
echo %BatchName%: Installing Apache 2.4 64-bit ... 
mkdir "%InstallPath%Apache24" 
%SystemRoot%\System32\xcopy.exe "%SourcePath%\Apache24" "%InstallPath%Apache24\" /C /E /H /I /K /Q /R /Y >nul 

endlocal 

、彼らがどのように動作するか、コマンドプロンプトウィンドウを開き、そこに以下のコマンドを実行し、完全にコマンドごとに表示されているすべてのヘルプページをお読みください。

私はこのバッチコードを使用することをお勧め非常に慎重に。 %~dp0%~n0%~1の説明については

  • call /? ...。
  • dism /?
  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • msiexec /?
  • rem /?
  • set /?
  • setlocal /?
  • xcopy /?

そして

そして最後に見てみましょう:

すべてここに書かをねじる必要があるのWindowsサーバの管理者と参照されているページでは、小さな指が丸い。

+0

WOW!どうもありがとうございました!私はその仕事が完全にどのように実現したのか分からなかった。それは私の問題を本当に助けて解決しました。 いくつかのコマンドを利用できるようにしたもう1つのことは、sys32フォルダから直接呼び出すことです。 – Poly

関連する問題