1

パスが長すぎるという人もいますが、多くの場合、同じバッチ スクリプトを のようなコードで繰り返し呼び出すことによって問題が発生しますset mypath=%mypath%;appendix人々はそれを認識していません。終了時に環境変数を復元する解決策を提案しました

set old_path=classpath
set classpath=%classpath%;appendix
java myApp
set classpath=old_path

しかし、それは退屈でエラーが発生しやすいです。例外、別の出口パスが原因で回復または失敗することを簡単に忘れる可能性があります。これを自動的に行うことはできますか?

賢い付録から始めることができます。つまり、パスを無条件に追加することによって問題が発生するということです。既にパスに付録がありますが、何度も追加します。それが問題の根源です。同じ問題がbashにも当てはまると思います。パスを確認して、欠落しているエントリのみを追加できますか? 標準的な解決策は何ですか?

4

4 に答える 4

4

まず、コードが機能しません。たとえばold_path、最後のコマンドの文字列です。

set "old_path=%classpath%"
set "classpath=%classpath%;%appendix%"
java myApp
set "classpath=%old_path%"

次に、バッチで新しい環境を使用して、このような問題を回避します。

@echo off
echo %path%
setlocal
set "path="
echo %path%
endlocal
echo %path%
于 2013-10-28T09:29:40.763 に答える
2

編集済み - コメントの修正に合わせて調整するには (そして、ジェブも防弾もありません。足を撃たないようにしてください)

完了するために、このバッチは、まだ含まれていない場合にのみ、指定された変数に 1 つ以上の要素を追加します。

@echo off

    call :addToVariable %*

    exit /b

:addToVariable
    rem %1 = variable name where to add elements
    rem %2 = element to add
    rem %3-... the rest of the elements. Will be shifted to retrieve

    rem if no data, no work
    if "%~1"=="" goto :EOF
    if "%~2"=="" goto :EOF

    rem prepare environment to work
    setlocal enableextensions enabledelayedexpansion

    rem get variable name to work
    set "_var=%~1"

    rem get original value of variable 
    if defined %_var% (
        set "_value=!%_var%:"=!"
        rem " this line does nothing but correct sintax highlighting
    ) else (
        set _value=
    )

    rem skip to arguments with elements to include
    shift

    rem list of elements to add to original variable
    set _add=

:addToVariableLoop
    rem iterate over parameters
    for %%d in ( %1 ) do (

        rem test if new directory already in original or temporary variable
        echo ";!_value!;!_add!;" | findstr /i /c:";%%~d;" >nul 2>nul 

        rem if not in variable, add to temporary variable
        if not errorlevel 1 (
            echo [%%~d] already included
        ) else (
            echo adding [%%~d] 
            set "_add=!_add!;%%~d"
        )

    )

    rem check if more elements are pending in call
    if not "%~2"=="" (
        shift
        goto :addToVariableLoop
    )

    set "_value=%_value%%_add%"

    endlocal & set "%_var%=%_value%"
    goto :EOF

バッチ ファイルがpathAdd.cmdの場合、パス変数に追加するには、次のように呼び出します。

pathAdd path c:\windows;c:\test;"c:\something more"

classPath 変数呼び出しに追加するには

pathAdd classPath c:\windows\system32\drivers

PSModulePath 変数呼び出しに追加するには

pathAdd PSModulePath "c:\Somewhere over the rainbow";c:\Users

....

于 2013-10-28T10:29:28.320 に答える
1

この質問の目的が、特定のファイルへのパスが存在するかどうかを知り、存在し%PATH%ない場合は挿入することである場合 (これが唯一の理由だと思います)、少し異なる方法で解決される可能性があります。 「特定のファイルのディレクトリが %PATH% に存在するかどうかを確認する方法」は既に? この問題は、次の方法で簡単に解決できます。

for %%p in (programname.exe) do set "progpath=%%~$PATH:p"
if not defined progpath (
   rem The path to programname.exe don't exist in PATH variable, insert it:
   set "PATH=%PATH%;C:\path\to\progranname"
)

検索ファイルの拡張子がわからない場合は、すべてを確認してください。

set "progpath="
for %%e in (%PATHEXT%) do (
   if not defined progpath (
      for %%p in (programname.%%e) do set "progpath=%%~$PATH:p"
   )
)

このメソッドは、任意のファイル名や拡張子、またはその他の変数PATH( などclasspath) で機能します。

于 2013-10-28T19:09:37.383 に答える
1

%path% 変数を再構築して、短いパス (8.3 表記) のみを含めるスクリプトを次に示します。

@echo off
setlocal disableDelayedExpansion
REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%

setlocal enableDelayedExpansion
set _path_=!path:;=%NL%!
rem  iteration
set "short_path="
for /f "delims=" %%I in ("!_path_!") do set  short_path=!short_path!;%%~dpsnxI
endlocal & set short_path=%short_path%
echo %short_path%

endlocal

クラスパスに置き換えPATHて、その要素の短いパスを取得できます。最終的には役立ちます。

付録の長さとパスをチェックして、制限に達するかどうかを確認することもできます。不足している要素のみを含むスクリプトで回答を更新します....

于 2013-10-28T09:25:33.107 に答える