2

fciv.exeファイルがシステム ディレクトリに配置されていると仮定すると、C:\WINDOWS\system32コマンド プロンプトから呼び出した場合と、バッチ スクリプト ファイルで使用した場合の両方で正しく機能します。例えば:

@echo off
fciv -md5 C:\DOCUME~1\myUsername
pause

上記のステートメントはうまく機能します。ただし、次の例のように、サイクルfciv内で使用すると:for

@echo off
for /f "tokens=1 delims=/ " %%g in ('fciv -md5 C:\DOCUME~1\myUsername') do (echo %%g)

コマンドが認識されず、コマンド プロンプトからエラーが返されます。

"fciv" is not recognized as internal or external command, etc.

コマンドプロンプトでも同じステートメントが機能します-もちろん%g変数を使用します。
バッチ ファイル内のサイクルでコマンドとして正しく解釈されるために、ファイルforへのフル パスを使用する必要がありfciv.exeます。
なぜこれが起こるのか説明できる人はいますか?

4

1 に答える 1

1

MC NDは、ここで回答として繰り返されるコメントで既に正しい回答を与えています。

質問者のバッチファイルには、fciv代わりに、fciv.exeまたはそれ以上のものが含まれています"Full\Path To\fciv.exe"

したがって、Windows は最初に現在の作業ディレクトリで、環境変数PATHEXTfciv.*にリストされている拡張子の 1 つをセミコロンで区切ったファイルを検索し、そのようなファイル拡張子を持つファイルが見つからない場合は、環境変数 PATHEXT にリストされているすべてのディレクトリ区切って検索します。セミコロンで。

また、ユーザー アカウントに定義されている環境変数PATHが、バッチ ファイル内で実行中の行より上に追加され、fcivを含むディレクトリへのパスが削除されましたfciv.exe。したがって、Windows はバッチ ファイルの実行時にこのアプリケーションを見つけることができませんでした。

ヒント 1:バッチ ファイル内で呼び出された、または開始されたアプリケーションの場合、ほとんどの場合、アプリケーションのファイル名にファイル拡張子を付けて指定することをお勧めします。これにより、Windows は、拡張子が COM、EXE、BAT のファイルを検索する代わりに
、たとえば直接検索できるようになります。 、...fciv.exefciv.*

ヒント 2:
たとえば、パスが固定されている場合は、呼び出された、または開始されたアプリケーションのファイル名をフル パスで指定することをお勧めします。

  • バッチ ファイルが 1 台のコンピューターでのみ実行される場合、
  • または、アプリケーションが同じディレクトリ内のすべてのコンピューターに確実にインストールされている、
  • または、バッチファイルがクライアントによって実行され、サーバー上のパブリック共有を介して直接アプリケーションを呼び出し/開始している間のみ、アプリケーションがサーバーにインストールされます。

結論:

  • 悪いのは:   fciv
  • より良いのは:fciv.exe
  • ベストは:   "Full\Path To\fciv.exe"

アプリケーションの最適な参照が常に可能であるとは限りませんが、ファイル拡張子を使用してアプリケーション ファイル名を参照することは、ほぼ常に可能です。

于 2014-07-24T21:27:49.253 に答える