読者です 読者をやめる 読者になる 読者になる

Life, Education, Death

プログラミング以外でも思ったことをつらつらと書きたい

PATHを通したい。ただしCUIからに限る

修正

前回のスクリプトだと、addした際に;が余分につくので修正した。

Windows環境変数をコマンドから編集したい

とある事情により、ちょろっとコマンドから編集する機会があったので、調べてみたら
@IT:Windows TIPS -- Tips:WSHで環境変数を設定する
を見つけた。

SETコマンドでは揮発してしまう環境変数の設定がちゃんとできるらしい。

でもこれだと簡単に使えないのでちょっと改造した。



以下を適当なテキストエディタにはっつけて、wsfって拡張子で保存すると動く。

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
 <job id="environment">
      <runtime>
         <description>PATH設定スクリプト</description>
         <unnamed
             name = "command"
             helpstring = "コマンド名(list,add,removeのいずれか)"
             type = "string"
              required = "true"
         />
         <unnamed
             name = "pathValue"
             helpstring = "listの場合は不要. add,removeのときは追加、削除する値"
             type = "string"
             required = "false"
          />
         <example>Example: envpath_manager.wsf command [pathValue]</example>
     </runtime>
	<script language="JScript">
	<![CDATA[
		if( WScript.Arguments.length < 1 )
		{
			appEnd();
		}

		var commandName = WScript.Arguments.Item(0);

		var WshShell	= WScript.CreateObject("WScript.Shell");
		var WshEnvironment = WshShell.Environment("User");
		var envVarList = WshEnvironment.Item("PATH").split(";");

		var command;
		switch( commandName )
		{
			case "add":
				command = addValue;
			break;
			case "remove":
				command = removeValue;
			break;
			case "list":
				command = displayList;
			break;
			default:
				appEnd();
		}
		
		if( command() == false )
		{
			appEnd()
		}

		function addValue()
		{
			if( WScript.Arguments.length != 2 )
				return false;

			var pathValue	= WScript.Arguments.Item(1);

			for( var i in envVarList )
			{
				if( envVarList[i] == "" )
					continue;

				if( envVarList[i] == pathValue )
				{
					WScript.Echo("すでに登録されている値です");
					WScript.Quit();
				}
			}
			
			var resultValue = WshEnvironment.Item("PATH");
			if( pathValue.charAt( pathValue.length-1 ) != ";" )
				pathValue += ";";
			resultValue += pathValue;
			WshEnvironment.Item("PATH") = resultValue;
		}
		
		function removeValue()
		{
			if( WScript.Arguments.length != 2 )
				return false;

			var pathValue	= WScript.Arguments.Item(1);

			var resultValue = "";
			for( var i in envVarList )
			{
				if( envVarList[i] == pathValue )
				{
					continue;
				}
				resultValue += envVarList[i] + ";";
			}
			WshEnvironment.Item("PATH") = resultValue;
		}
		
		function displayList()
		{
			if( WScript.Arguments.length != 1 )
				return false;
		
			for( var i in envVarList )
			{
				if( envVarList[i] == "" )
					continue;

				WScript.Echo(envVarList[i]);
			}
			return true;
		}
		
		function appEnd()
		{
			WScript.Arguments.ShowUsage();
			WScript.Quit();
		}
	]]>
	</script>
 </job>
</package>

例(example)

保存したスクリプトをenvpath_manager.wsfとしたと仮定

PATH変数をリスト表示

envpath_manager.wsf list

c:\python\binをPATHに追加

envpath_manager.wsf add c:\python\bin

c:\python\binをPATHから削除

envpath_manager.wsf remove c:\python\bin


素敵なCUIライフを

前回のスクリプト

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
 <job id="environment">
      <runtime>
         <description>PATH設定スクリプト</description>
         <unnamed
             name = "command"
             helpstring = "コマンド名(list,add,removeのいずれか)"
             type = "string"
              required = "true"
         />
         <unnamed
             name = "pathValue"
             helpstring = "listの場合は不要. add,removeのときは追加、削除する値"
             type = "string"
             required = "false"
          />
         <example>Example: envpath_manager.wsf command [pathValue]</example>
     </runtime>
	<script language="JScript">
	<![CDATA[
		if( WScript.Arguments.length < 1 )
		{
			appEnd();
		}

		var commandName = WScript.Arguments.Item(0);

		var WshShell	= WScript.CreateObject("WScript.Shell");
		var WshEnvironment = WshShell.Environment("User");
		var envVarList = WshEnvironment.Item("PATH").split(";");

		var command;
		switch( commandName )
		{
			case "add":
				command = addValue;
			break;
			case "remove":
				command = removeValue;
			break;
			case "list":
				command = displayList;
			break;
			default:
				appEnd();
		}
		
		if( command() == false )
		{
			appEnd()
		}

		function addValue()
		{
			if( WScript.Arguments.length != 2 )
				return false;

			var pathValue	= WScript.Arguments.Item(1);

			for( var i in envVarList )
			{
				if( envVarList[i] == "" )
					continue;

				if( envVarList[i] == pathValue )
				{
					WScript.Echo("すでに登録されている値です");
					WScript.Quit();
				}
			}
			
			var resultValue = WshEnvironment.Item("PATH");
			if( pathValue.charAt( pathValue.length-1 ) != ";" )
				resultValue += ";";
			resultValue += pathValue + ";";
			WshEnvironment.Item("PATH") = resultValue;
		}
		
		function removeValue()
		{
			if( WScript.Arguments.length != 2 )
				return false;

			var pathValue	= WScript.Arguments.Item(1);

			var resultValue = "";
			for( var i in envVarList )
			{
				if( envVarList[i] == pathValue )
				{
					continue;
				}
				resultValue += envVarList[i] + ";";
			}
			WshEnvironment.Item("PATH") = resultValue;
		}
		
		function displayList()
		{
			if( WScript.Arguments.length != 1 )
				return false;
		
			for( var i in envVarList )
			{
				if( envVarList[i] == "" )
					continue;

				WScript.Echo(envVarList[i]);
			}
			return true;
		}
		
		function appEnd()
		{
			WScript.Arguments.ShowUsage();
			WScript.Quit();
		}
	]]>
	</script>
 </job>
</package>