프로세스 별 환경 변수 (PATH)가 설정된 명령 프롬프트 시작

개요



자주 사용하는 툴군의 패스가 왠지 통과하지 않지만,
· 시스템의 환경 변수 (PATH)를 괴롭히고 싶지 않습니다.
· 명령 프롬프트마다 적절하게 전환하고 싶습니다.
라고 하는 것이 있었으므로, 프로세스 고유의 환경 변수(PATH)를 설정한 프롬프트를 시작하도록(듯이) 합니다.

이것을 ruby의 setrbvars.bat를 소재에 vbscript와 rb로 써 보겠습니다.

코드 - vbscript



포인트가 되는 코드를 vbscript로 나타냅니다. rb에서도 win32ole을 사용하기 때문에 대체로 동일합니다. 응용예 2 참조

cmd_after_addpath.vbs
'利用するオブジェクトを生成しておく
set shell = CreateObject("WScript.Shell")
set fso   = CreateObject("Scripting.FileSystemObject") 'path_to_addに設定するもの次第ではfsoはなくてもOK

'このスクリプトがあるフォルダをパスに追加する
path_to_add = fso.getParentFolderName(WScript.ScriptFullName)

' たちあげたプロンプトにだけ一時的に追加したいのでEnvironment("Process")にしておく。
set env = shell.Environment("Process")
env.Item("PATH") =  path_to_add & ";" & env.item("PATH")

' cmd.exeを実行する
shell.Run "cmd.exe /K", ,FALSE

cmd.exe 매개 변수에/K를 지정하는 것은

Cmd - DOS 명령 목록 - Programming Field
/K <command> <command> 로 지정한 내용을 실행합니다. 실행 후 "이 명령을 실행 한 cmd.exe"는 종료되지 않고 프롬프트가 계속 표시됩니다.

그렇다고 하는 것을 이용해, 커멘드 프롬프트에 나가 버리는 로고(↓)를 내놓지 않기 위해서입니다.

로고
Microsoft Windows [Version xx.y.zzzzzzzz]
(c) 201y Microsoft Corporation. All rights reserved.

개조하면 나름대로의 로고를 내는 데 사용할 수 있습니다.
예를 들어, 다음과 같이 하면 추가한 패스를 로고 대신에 발행합니다.

개조
' cmd.exeを実行する
shell.Run "cmd.exe /K echo " & path_to_add & " is temporary added to PATH", ,FALSE

응용예 1



setrbvars.vbs
'利用するオブジェクトを生成しておく
set shell = CreateObject("WScript.Shell")
set fso   = CreateObject("Scripting.FileSystemObject") 'path_to_addに設定するもの次第ではfsoはなくてもOK

'このスクリプトがあるフォルダをパスに追加する
'SET RUBY_BIN=%CD% 相当の処理
path_to_add = fso.getParentFolderName(WScript.ScriptFullName)

' たちあげたプロンプトにだけ一時的に追加したいのでEnvironment("Process")にしておく。
' SET PATH=%RUBY_BIN%;%PATH%相当の処理
set env = shell.Environment("Process")
env.Item("PATH") =  path_to_add & ";" & env.item("PATH")

' cmd.exeを実行する
' ruby.exe -v相当の処理
shell.Run "cmd.exe /K ruby.exe -v", ,FALSE

setrbvars.vbs를 ruby.exe와 같은 폴더에서 두 번 클릭하면 명령 프롬프트가 시작됩니다.


setrbvars.bat는 C:\Windows\System32\cmd.exe /E:ON /K C:\Ruby22-x64\bin\setrbvars.bat와 같이 cmd.exe에서 실행됩니다.
setrbvars.vbs는 WScript.exe 또는 CScript.exe에서 실행되며 cmd.exe를 하위 프로세스로 생성한다는 차이점이 있습니다.

응용예 2



setrbvars.rb
require "win32ole"
shell = WIN32OLE.new("WScript.Shell")
env   = shell.Environment("Process")
env.setproperty("item", "PATH", File.expand_path(File.dirname(__FILE__)).gsub("/", "\\\\") + ";" + env.item("PATH"))
shell.Run("cmd.exe /K ruby.exe -v",nil,false)

더블 클릭으로 rb를 실행할 수 있게 되면, 이것을 클릭하는 것만으로 「Ruby 명령 프롬프트 열기」와 같이 명령 프롬프트가 기동합니다.

사용법



추가 예정
cmd_after_addpath.vbs의 바로 가기를 명령 프롬프트의 현재 폴더로 만들 폴더를 만들고,
작업 폴더 필드를 비워 두거나 ... 아이콘을 변경하거나 ... Anaconda Prompt 시작에 대해 알아보기 - Qiita

비고



원래는 bat-->vbscript-->bat 같은 느낌으로 일시적인 환경 변수를 교환하려고 했습니다
"bat 프로세스 간 환경 변수 인계 공유"로 가면,

bat 파일에서 환경 변수 공유 정보

PATIO 2008/03/25(화) 10:34:14
확실히 실행 파일의 환경 변수는 기동한 환경의 환경 변수의 카피였다고 생각합니다.
그래서 실행 파일의 환경 변수를 변경해도 기동한 환경의 환경 변수는 바꿀 수 없을 것입니다.
결론적으로 환경 변수로 데이터를 반환할 수는 없다.

라는 것으로, Environment("System"), Environment("User"), Environment("Volatile")와 같이 「일시적이 아닌 것」을 사용하지 않으면 계승하지 않는 것 같았습니다.
하고 싶은 것은, 「들었던 프롬프트에만 임시로 추가하고 싶다」이므로, Environment("Process")와 동등한 스코프가 아니면 조금 형편이 나쁘다

반대로,

bat 파일에서 환경 변수 공유 정보

麩 2008/03/25(火) 16:58:44
EXE에서 호출자 Bat로 돌아가는 것은 포기하고, 계속의 처리를 EXE의 자식 프로세스로서 생성해 버리면 환경 변수의 인계는 할 수 없습니까?

그래서 자식 프로세스는 Environment("Process")를 인수하는 것 같아서 vbscript에서 cmd.exe를 시작하도록 했습니다.

쓰는 동안 "이 내용이라면 루비의 win32ole에도 할 수있을 것"이라고 깨달았기 때문에,
[ruby-list 31108] Re WIN32OLE 질문 환경 변수 설정은 어떻게 합니까? 을 참고로 했습니다.

참고



[ruby-list 31108] Re WIN32OLE 질문 환경 변수 설정은 어떻게 합니까?
Anaconda Prompt 시작에 대해 알아보기 - Qiita
bat 파일 내에서 환경 변수 공유에 대해 – 라라 엔지니어 라운지
Cmd - DOS 명령 목록 - Programming Field
모든 것은 시간에 ... [VBScript] 환경 변수 등록
MS Windows_VBScript - PukiWiki
@ IT : Windows TIPS - Tips : WSH에서 환경 변수 설정
Tech TIPS: setx에서 환경 변수의 값 설정(기본편) - @IT
일시적으로 환경 변수를 설정하고 프로그램을 시작하는 JScript PuppyLinux로 폭속 PC 라이프
일시적으로 환경 변수 XYZZYHOME을 설정한 다음 xyzzy를 시작합니다. - Cookie & Ice cream
Environment 속성

좋은 웹페이지 즐겨찾기