your programing

Windows에서 PATH 환경변수가 과도하게 입력되지 않도록 하려면 어떻게 해야 합니까?

lovepro 2023. 4. 22. 22:33
반응형

Windows에서 PATH 환경변수가 과도하게 입력되지 않도록 하려면 어떻게 해야 합니까?

시스템에서 실행 파일을 관리하기 위해 사용하는 방법을 알고 싶습니다.예를 들어 명령줄에서 거의 모든 항목에 액세스할 수 있지만 경로 문자열의 제한에 도달했기 때문에 더 이상 dir를 추가할 수 없습니다.

그래서 당신은 무엇을 추천합니까?오래 전에 패스에 속하는 Dir에서 실행 파일의 softLinks를 사용하려고 했지만, 그 방법은 효과가 없었습니다."실행 파일만"을 알려진 Dir에 던지면 거의 모든 응용 프로그램이 파일 세트를 필요로 하는 문제가 발생하므로 이 또한 좋지 않습니다.실행 파일과 그의 모든 파일을 알려진 Dir에 던집니다. 음, 이것은 작동하지만 파일 이름으로 충돌이 발생할 가능성은 매우 높습니다.HardLink를 만든다고요? 모르겠어요.당신은 어떻게 생각하나요?

그러면 %PATH% 환경변수가 해석되고 각 디렉토리가 해당 단축명으로 변환된 후 모두 다시 결합됩니다.

@echo off

SET MyPath=%PATH%
echo %MyPath%
echo --

setlocal EnableDelayedExpansion

SET TempPath="%MyPath:;=";"%"
SET var=
FOR %%a IN (%TempPath%) DO (
    IF exist %%~sa (
        SET "var=!var!;%%~sa"
    ) ELSE (
        echo %%a does not exist
    )
)

echo --
echo !var:~1!

출력을 가져와 환경변수의 PATH 변수를 업데이트합니다.

생각할 수 있는 한 가지 방법은 다른 환경 변수를 사용하여 부분 경로를 저장하는 것입니다. 예를 들어,

C:\this_is_a\long_path\that_appears\in_multiple_places\subdir1;
C:\this_is_a\long_path\that_appears\in_multiple_places\subdir2;

그런 다음 다음과 같은 새로운 환경 변수를 생성할 수 있습니다.

SET P1=C:\this_is_a\long_path\that_appears\in_multiple_places

그 후 당신의 원래 경로가

%P1%\subdir1;
%P1%\subdir2;

편집: 또 다른 옵션은,bin「」가 보관 유지되고 ..bat 「」를 하는 .exefiles.complete files files files files files files files files.

편집 2: 다른 답변에 대한 Ben Voigt의 코멘트에 따르면 제안된 다른 환경변수를 사용해도 다음 명령의 길이를 줄일 수 없습니다.%PATH%저장되기 전에 확장될 것이기 때문입니다.이것은 사실일 수도 있고 나는 그것을 테스트하지 않았다., 긴 는, 8 을 사용하는 를 들어, 8 dot3 형식을 사용합니다.C:\Program Files으로는 '이렇게 하다'에 합니다.C:\PROGRA~1를 사용할 수 있습니다.dir /x더 짧은 이름을 볼 수 있습니다.

편집 3: 이 간단한 테스트는 나를 Ben Voigt가 옳다는 것을 믿게 한다.

set test1=hello
set test2=%test1%hello
set test1=bye
echo %test2%

입니다.hellohellobyehello.

편집 4: 배치 파일을 사용하여 특정 경로를 삭제하기로 결정한 경우%PATH%프로세스가 투과적이 되도록 배치 파일에서 실행 파일로 인수를 전달하는 방법에 대해 고민할 수 있습니다(즉, 배치 파일을 호출하는 것과 실행 파일을 호출하는 것의 차이는 없습니다).배치파일을 써본 경험이 별로 없지만, 이 방법은 잘 작동하는 것 같습니다.

@echo off

rem This batch file points to an executable of the same name
rem that is located in another directory. Specify the directory
rem here:

set actualdir=c:\this_is\an_example_path

rem You do not need to change anything that follows.

set actualfile=%0
set args=%1
:beginloop
if "%1" == "" goto endloop
shift
set args=%args% %1
goto beginloop
:endloop
%actualdir%\%actualfile% %args%

일반적으로 인터넷에서 배치 파일을 실행할 때 주의해야 합니다. 하드 드라이브를 포맷하는 등 배치 파일로 모든 작업을 수행할 수 있기 때문입니다.위의 코드를 신뢰할 수 없는 경우(제가 작성한 코드) 회선을 교체하여 테스트할 수 있습니다.

%actualdir%\%actualfile% %args%

와 함께

echo %actualdir%\%actualfile% %args%

실행 전에 모든 회선의 기능을 정확하게 파악하는 것이 이상적입니다.

Windows Vista 이상을 사용하는 경우 폴더에 대한 심볼 링크를 만들 수 있습니다.예를 들어 다음과 같습니다.

mklink /d C:\pf "C:\Program Files"

를 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」c:\pf의 것이 될 program files.나는 이 속임수를 써서 내 길에서 300자를 줄였다.

혹시 관심 있으신 분 계시다면...

이 모든 경로가 한 번에 필요한 경우는 거의 없기 때문에 그에 따라 경로를 변경하는 "초기화" 배치 파일을 많이 만듭니다.

예를 들어, Eclipse에서 C++ 개발을 하고 싶다면 다음을 수행합니다.

> initmingw
> initeclipse
> eclipse

이것은, 같은 이름의 실행 파일(양쪽 모두 make.exe 를 가지는 C++ 와 D 컴파일러등)간의 경합을 회피하는 경우에도 편리합니다.

배치 파일은 일반적으로 다음과 같습니다.

@echo off
set PATH=C:\Path\To\My\Stuff1;%PATH%
set PATH=C:\Path\To\My\Stuff2;%PATH%

저는 이 접근법이 비교적 깨끗하며 아직 어떤 문제도 발생하지 않았다고 생각합니다.

일반적으로 이것에 대해서는 걱정할 필요가 없습니다(패스 사이즈의 제한은 없습니다만, 최신의 Windows 시스템에서는 그것이 무엇인지도 모릅니다).하지만, 프로그램의 디렉토리가 패스에 들어가는 것을 피하기 위해서, 다음과 같이 할 수 있습니다.

  • 는 대대 a a a a a a a a a a a a a a에 됩니다.c:\util
  • 않으면 cmd/을 cmd/batch에 c:\util하다

    @"c:\program files\whereever\foo.exe" %*
    

기본적으로 명령어에 대한 에일리어스가 생성됩니다.꼭 완벽하다고는 할 수 없습니다.일부 프로그램(요즘에는 거의 드물지만)은 이 경로를 따르기를 고집하고 있으며, 이 경로를 호출하려고 하는 다른 프로그램에서는 이 경로를 제대로 찾지 못할 수 있습니다.하지만 대부분의 경우 잘 작동합니다.

그러나 일반적으로 경로에 디렉토리를 추가하는 것을 피할 필요가 없습니다.

또 다른 아이디어:DIR /X를 사용하여 비 8dot3 파일 이름에 대해 생성된 단축 이름을 결정합니다.그런 다음 %PATH%에서 이것들을 사용합니다.

예를 들어 'C:\Program Files'는 'C:\PROGRA~1'이 됩니다.

응용 프로그램별 경로에 대한 경로 변수 대신 App Path 레지스트리 키를 사용합니다.

http://msdn.microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx

표준 스트림(stdin/stderr/stdout)과 종료 코드 PROXY 프로그램(디스패처 https://github.com/131/dispatcher))을 매번 작성하여 사용하고 있습니다.

사용하고 있는 CLI 프로그램(node, php, python, git, svn, rsync, plink...)은 모두 같은 디렉토리에 격납한 exe 파일(약 10kb, 이름만 다를 뿐)입니다.더미 정적 클리어 텍스트 파일은 "프록시 파일 이름과 실제 exe 매핑"을 수행합니다.

Dispatcher는 절대적으로 투과적이기 위해 낮은 수준의 프로세스 관리 win32 API를 사용합니다.

이 소프트웨어를 사용하면 사용할 수 있는 모든 프로그램에 대해 PATH에 1개의 추가 디렉토리만 설정할 수 있습니다.

c:\bin 폴더를 생성하여 말씀하신 대로 경로에 추가하고 하드링크를 하면 문자열이 짧아질 수 있습니다.값이 c:\Program Files인 시스템 vars에 변수 pf를 추가한 후 c:\Program Files를 경로 %pf%로 바꿉니다.

편집:

가상 드라이브를 만듭니다.서브 p: "c:\program files"

엔트리를 관리하기 쉽게 하려면 다음 절차를 수행합니다.

  1. 다양한 소프트웨어 패키지 사용 조합에 대해 다른 사용자를 생성.예: (a) 모든 웹 개발 소프트웨어를 사용하기 위한 사용자 웹 작성, (b) 모든 데이터베이스 및 데이터 웨어하우징 소프트웨어 패키지를 사용하기 위한 사용자 데이터베이스 작성.소프트웨어에 따라서는 복수의 엔트리가 작성되는 경우가 있습니다.또는 Oracle 고유 사용자, MSQL 고유 사용자 및 Oracle 고유 사용자로 나눌 수도 있습니다.MySQL/Postgre를 넣었습니다.SQL, Tomcat, wamp, xamp를 모두 사용자 계정 webr에 입력합니다.

  2. 가능하면 Office, Photoshop 등의 일반적인 패키지를 모든 사용자가 사용할 수 있는 시스템 고유의 패키지로 설치하고 사용자 고유의 특별한 패키지를 설치합니다.물론 다른 사용자에 로그인하여 설치해야 했습니다.일부 소프트웨어는 이 옵션을 제공하지 않을 수 있습니다.「install for this user only」옵션을 사용할 수 없는 경우는, 시스템 전체에 인스톨 합니다.

  3. 프로그램 파일(x86) 폴더 또는 프로그램 파일에 프로그램을 설치하지 않도록 합니다.항상 베이스 디렉토리에 인스톨 합니다.예를 들어 MySQL 64비트는 "C:\mysql64"에 들어가고 MySQL 32비트는 "C:\mysql" 폴더에 들어갑니다.저는 항상 64비트 소프트웨어에만 서픽스 64를 추가하는 것을 상정하고 있습니다.서픽스가 없는 경우는 32비트입니다.자바 등에도 같은 것을 팔로우하고 있습니다.이렇게 하면 "C:"를 포함하지 않고 내 경로가 짧아집니다.\Program File (x86) .소프트웨어에 따라서는 .exe 파일의 정확한 위치를 표시하기 위해 설정 파일을 편집해야 할 수 있습니다."C:"에 설치해야 하는 유일한 프로그램입니다.\Program File (x86)" 이 폴더에 설치됩니다.나는 항상 이름을 줄여서 쓰는 것을 기억한다.Tomcat/release/version-2.5.0.3과 같은 버전 번호는 피합니다.know 버전이 필요한 경우 이름 버전으로 파일을 생성하여 Tomcat 폴더에 넣습니다.일반적으로 가능한 한 링크를 단축합니다.

  4. 위의 모든 절차가 Windows 제한을 통과한 경우 경로에 대한 생략 링크를 대체할 배치를 포함합니다.

그런 다음 특정 용도(모바일 애플리케이션, 데이터베이스/데이터 웨어하우징 또는 웹 개발 등) 사용자에 로그인하여 관련 작업을 수행합니다.

창 내에 가상 창을 생성할 수도 있습니다.라이센스가 부여된 OS 복사본이 하나 있으면 동일한 키를 사용하여 여러 개의 가상 창을 생성할 수 있습니다.특정 태스크에 대한 패키지를 해당 시스템에 넣을 수 있습니다.매번 별도의 VM을 실행해야 합니다.3D 애니메이션 무비 메이커와 같은 메모리 사용량이 많은 일부 패키지는 모두 VM이 아닌 메인 머신에 넣어야 합니다.VM은 RAM의 일부만 사용할 수 있기 때문입니다.다만, 각 VM을 기동하는 것은 귀찮습니다.

위의 솔루션은 경로를 줄일 수 있는 경우에만 작동합니다.저 같은 경우에는 그런 옵션이 아니었고 명령 프롬프트를 열 때마다 스크립트를 실행해야 하는 번거로움이 있었습니다.그래서 명령 프롬프트를 열면 자동으로 실행되며 텍스트 파일의 내용을 경로에 추가하는 간단한 스크립트를 작성했습니다.

또한 이 스크립트를 실행하면 (예를 들어 github 또는 cygwin 쉘에서) 문제가 발생하는 컨텍스트도 있습니다.따라서 명령어프롬프트가 기동되어도 패스를 갱신하는 스타트업 스크립트를 통해 패스 변수가 변경되지 않는 패스 목록이 포함된 파일도 추가했습니다.

@echo off

:: Modify these to the actual paths of these two files
set dontSetupFile=C:\Users\Yams\Dontsetup.txt
set pathFile=C:\Users\Yams\Path.txt

:: Retrieve the current path (for determining whether or not we should append to our path)
set curDir=%cd%

:: Be done if the current path is listed in the dontSetupFile
SetLocal EnableDelayedExpansion
for /F "delims=" %%i in (%dontSetupFile%) do (
    if "%%i"=="%curDir%" GOTO AllDone
)



:: Append the pathFile to our current PATH
set pathAppend=
for /F "delims=" %%i in (%pathFile%) do (set pathAppend=!pathAppend!%%i)

set PATH=%PATH%;%pathAppend%


:: The only way to actually modify a command prompt's path via a batch file is by starting
::   up another command prompt window. So we will do this, however, if this script is
::   automatically called on startup of any command prompt window, it will infinately 
::   recurse and bad things will happen.

:: If we already ran, we are done
if "%yams%"=="onion" GOTO AllDone

:: Otherwise, flag that we just ran, and then start up a new command prompt window
::   with this flag set
set yams=onion

cmd \K set PATH=%PATH%;

:: When that command prompt exits, it will load back up this command prompt window, and
::   then the user will need to exit out of this as well. This causes this window to
::   automatically exit once the cmd it just spawned is closed.
exit()

:: Path is set up, we are done!
:AllDone
@echo on

Path.txt는 다음과 같습니다.

C:\Program Files (x86)\Google\google_appengine;
C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
C:\Program Files\Microsoft SQL Server\110\Tools\Binn;
C:\Program Files\Microsoft DNX\Dnvm;
C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit;

돈셋업 하는 동안.txt는 다음과 같이 됩니다.

C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit
C:\Program Files (x86)\Git\cmd
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

부팅 시 자동으로 실행되도록 하려면 regedit을 열고 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Command Processor로 이동한 후 오른쪽 버튼을 클릭하여 new -> Multi-String Value를 누릅니다.자동 실행이라고 합니다.값 설정

C:\Users\Yams\setUpPath.bat

또는 위의 배치파일을 저장한 다른 장소에서도 사용할 수 있습니다.

시도하지 않았지만 PATH를 부품으로 분할하여 최종 가변 작업에 결합할 수 있습니까?

예를 들어 처음에 다음과 같은 것이 있다고 가정해 보겠습니다.

PATH={LONGPATH1};{LONGPATH2};....{2048th char}....{LONGPATH_N-1};{LONGPATH_N}

대신 다음을 작성합니다.

_PATH1 = {LONGPATH1};{LONGPATH2};....{2048 char}
_PATH2 = {2049th char}...{LONGPATH_N-1};{LONGPATH_N}
rem // may be more parts
PATH = %_PATH1%;%_PATH2%

언급URL : https://stackoverflow.com/questions/4405091/how-do-you-avoid-over-populating-the-path-environment-variable-in-windows

반응형