シチュエーション別同一目的 -- Part1

  目次



PATH環境変数の値を個別パス毎にソートしてファイルに書き込む





  古典的



  
cl.exe lang_01.cpp
  
↑ビルド

↓VC6 用に必要な PATH 環境変数
C:\Program Files\Microsoft Visual Studio\COMMON\MSDev98\Bin
  
Set CL6="C:\Program Files\Microsoft Visual Studio\VC98\Bin\cl.exe"
Set LINK6="C:\Program Files\Microsoft Visual Studio\VC98\Bin\link.exe"
Set INC6="C:\Program Files\Microsoft Visual Studio\VC98\Include"
Set LIB6="C:\Program Files\Microsoft Visual Studio\VC98\Lib"
%CL6% lang_01.cpp /c /I%INC6%
%LINK6% /LIBPATH:%LIB6% lang_01.obj
  
↑ビルド2

↓VC7(.NET 2003) 用に必要な PATH 環境変数
C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE
  
Set CL7="C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\cl.exe"
Set LINK7="C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\link.exe"
Set INC7="C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include"
Set LIB7="C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib"

Set INCSDK="C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include"
Set LIBSDK="C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Lib"

%CL7% lang_01.cpp /c /I%INC7% /I%INCSDK%
%LINK7% /LIBPATH:%LIB7% /LIBPATH:%LIBSDK% lang_01.obj
  
↑ビルド3


http://msdn.microsoft.com/library/ja/vclib/html/_crt_getenv.2c_._wgetenv.asp
http://msdn.microsoft.com/library/ja/vclib/html/_crt_strtok.2c_.wcstok.2c_._mbstok.asp

  
#include <stdio.h>
#include <stdlib.h>
#include <mbstring.h>

int main() {

	char *ptr;
	unsigned char* tok;

	ptr = getenv( "PATH" );

	tok = _mbstok( (unsigned char *)ptr, (const unsigned char *)";" );
	while( tok != NULL ) {
		printf( "%s\n", tok );
		tok = _mbstok( NULL, (const unsigned char *)";" );
	}

	return 0;
}
  

SORTは、SORT.EXE を使用し、ファイルへはリダイレクトで書き込む
  
lang_01.exe | sort.exe > result.txt
  



  C++ API+ランタイムライブラリ

  
cl.exe lang_02.cpp
  
↑ビルド

  
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <mbstring.h>


int compare( const void *arg1, const void *arg2 );

int main() {

	LPTSTR lpBuffer = NULL;
	DWORD nSize;	// バッファサイズ

	// 必要なバッファサイズを取得する
	nSize = GetEnvironmentVariable(
		"PATH",
		lpBuffer,
		0
	);

	// バッファを動的に確保する
	HANDLE hMem = GetProcessHeap();
	lpBuffer = (LPTSTR)HeapAlloc(hMem, 0, nSize); 
	if ( lpBuffer == NULL ) {
		printf( "%s\n", "メモリの確保に失敗しました" );
		return 0;
	}

	// PATH 環境変数取得( 1回目 )
	GetEnvironmentVariable(
		"PATH",
		lpBuffer,
		nSize
	);

	// トークンの数をカウントする
	unsigned char* tok;
	int nCount;		// トークンの数

	tok = _mbstok( (unsigned char *)lpBuffer, (const unsigned char *)";" );
	nCount = 0;
	while( tok != NULL ) {
		nCount++;
		tok = _mbstok( NULL, (const unsigned char *)";" );
	}

	// トークンをセットするのに必要なメモリを確保する
	LPTSTR *strArray = (LPTSTR *)HeapAlloc(hMem, 0, sizeof(LPTSTR)*nCount + 256 ); 

	// PATH 環境変数取得( 2回目 )
	GetEnvironmentVariable(
		"PATH",
		lpBuffer,
		nSize
	);

	// トークンを配列にセットする
	tok = _mbstok( (unsigned char *)lpBuffer, (const unsigned char *)";" );
	nCount = 0;
	while( tok != NULL ) {
		strArray[nCount] = (LPTSTR)tok;
		nCount++;
		tok = _mbstok( NULL, (const unsigned char *)";" );
	}

	// 配列ソート
	qsort( (void *)strArray, nCount, 4, compare );

	// 書き込み
	FILE *fp;
	fp = fopen( "result.txt", "wt" );
	int i;
	for( i = 0; i < nCount; i++ ) {
		fprintf( fp, "%s\n", strArray[i] );
	}
	fclose( fp );

	// メモリ開放
	HeapFree( hMem, 0, strArray );
	HeapFree( hMem, 0, lpBuffer );

	return 0;
}

// *********************************************************
// ソート用比較関数
// *********************************************************
int compare( const void *arg1, const void *arg2 )
{
	return lstrcmp( *((char **)arg1), *((char **)arg2) );
}
  

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_crt_qsort.asp



  C++ lightbox.lib

Set CL6="C:\Program Files\Microsoft Visual Studio\VC98\Bin\cl.exe"
Set LINK6="C:\Program Files\Microsoft Visual Studio\VC98\Bin\link.exe"
Set INC6="C:\Program Files\Microsoft Visual Studio\VC98\Include"
Set INCA="C:\Program Files\Microsoft Visual Studio\VC98\ATL\Include"
Set LIB6="C:\Program Files\Microsoft Visual Studio\VC98\Lib"
Set LIBS1=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
Set LIBS2=shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
%CL6% %1.cpp /c /I%INC6% /I%INCA%
%LINK6% /LIBPATH:%LIB6% %1.obj %LIBS1% %LIBS2%

  
#include "lightbox.h"

#if _MSC_VER > 1200
#pragma comment(linker, "/NODEFAULTLIB:LIBC.LIB")
#else
#ifdef _DEBUG
#pragma comment(linker, "/NODEFAULTLIB:LIBC.LIB")
#endif
#endif

int compare( const void *arg1, const void *arg2 );

int main() {

	LPTSTR lpBuffer;
	DWORD nSize;	// バッファサイズ

	// 必要なバッファサイズを取得する
	nSize = GetEnvironmentVariable(
		"PATH",
		lpBuffer,
		0
	);

	// バッファ確保
	LboxString LString;
	LString.Resize( nSize );

	// PATH 環境変数取得
	GetEnvironmentVariable(
		"PATH",
		LString.szLboxString,
		nSize
	);

	LboxToken LToken;
	LToken.CreateToken( LString, ";" );

	// 配列ソート
	qsort( (void *)LToken.Token, LToken.nCount, 4, compare );

	// 書き込み
	FILE *fp;
	fp = fopen( "result.txt", "wt" );
	int i;
	for( i = 0; i < LToken.nCount; i++ ) {
		fprintf( fp, "%s\n", LToken.Token[i] );
	}
	fclose( fp );

	return 0;
}

// *********************************************************
// ソート用比較関数
// *********************************************************
int compare( const void *arg1, const void *arg2 )
{
	return lstrcmp( *((char **)arg1), *((char **)arg2) );
}
  



  VBScript 版

  
' オブジェクト作成
Set WshShell = CreateObject("WScript.Shell")
Set Rs = CreateObject("ADODB.Recordset")
Set Fso = CreateObject( "Scripting.FileSystemObject" )

' システム環境変数を取得
Set WshSysEnv = WshShell.Environment("SYSTEM")
strEnvPath = WshSysEnv("PATH")

' ユーザー環境変数を取得
Set WshSysEnv = WshShell.Environment("USER")

strEnvPath = strEnvPath & ";" & WshSysEnv("PATH")

' トークンに分解
aData = Split( strEnvPath, ";" )

Const adVarChar = 200

' ソートに ADO のレコードセットを利用する
Rs.Fields.Append "ソートデータ", adVarChar,255
Rs.Open

For Each strData in aData

	if Trim( strData ) <> "" then
		Rs.AddNew
		Rs.Fields("ソートデータ").value = strData
		Rs.Update
	end if

Next

Rs.Sort = "ソートデータ"
Rs.MoveFirst

' テキストファイルに書き込む
Set OutObj = Fso.OpenTextFile( "result.txt", 2, True )
Do while not Rs.EOF

	OutObj.WriteLine Rs.Fields("ソートデータ").value & ""
	Rs.MoveNext

Loop
OutObj.Close

Rs.Close
  



  VB Framework 版

  
vbc.exe lang_05.bas
  
↑ビルド

↓Framework 書式
http://msdn.microsoft.com/ja-jp/library/txafckwd.aspx

  
Imports System.Environment
Imports System.IO

Module MyModule

' ********************************************************
' * 実行
' ********************************************************
Sub Main()

	' PATH 環境変数取得
	Dim strEnv as String = GetEnvironmentVariable( "PATH" )

	' 区切り文字定義
	Dim delimStr As String = ";"
	Dim delimiter As Char() = delimStr.ToCharArray()

	' 配列定義
	Dim split As String() = Nothing

	' トークン分割
	split = strEnv.Split( delimiter ) 

	' ソート
	Array.Sort( split, split.GetLowerBound(0), split.Length )

	Dim strValue as String

	' 書き込み
	Try
		Dim OutFile As StreamWriter = New StreamWriter("result.txt", false )
		For each strValue In split
			Call OutFile.WriteLine( strValue )
		Next
		OutFile.Flush()
		OutFile.Close()

	Catch e As Exception
		Console.WriteLine("エラーの内容 : {0}", e.ToString())
	End Try

End Sub

End Module
  



  C# 版

  
csc.exe lang_06.cs
  
↑ビルド

  
using System;
using System.IO;

// ********************************************************
// * 実行
// ********************************************************
public class App
{

	public static void Main() {

		// PATH 環境変数取得
		String strEnv = Environment.GetEnvironmentVariable( "PATH" );

		// 配列定義
		String delimStr = ";";
		Char[] delimiter = delimStr.ToCharArray();

		String[] split = null;

		// トークン分割
		split = strEnv.Split( delimiter );

		// ソート
		Array.Sort( split, split.GetLowerBound(0), split.Length );

		// 書き込み
		try {
			StreamWriter OutFile = new StreamWriter( @".\result.txt", false );
			foreach (String strValue in split) {
				OutFile.WriteLine( strValue );
			}
			OutFile.Flush();
			OutFile.Close();
	
		}
		catch( Exception e ) {
			Console.WriteLine("エラーの内容 : {0}", e.ToString());
		}
	}

}
  



  Java

  
javac lang_07.java
  
↑ビルド

  
java -cp . lang_07
  
↑実行

ソート順序が「自然順序付け」によって、他と違うの結果に注意
  
import java.io.*;
import java.util.*;

public class lang_07 {
	public static void main(String[] args) {

		String strEnv = System.getenv("PATH");

		String[] result = strEnv.split(";");

		Arrays.sort( result );

		try {
			PrintWriter outText = new PrintWriter(
				new BufferedWriter(
					new FileWriter( "result.txt" )
				)
			);

			for (int i = 0; i < result.length; i++) {
				outText.println( result[i] );
			}

			outText.close();

		}
		catch ( Exception e ) {
			System.err.println(e.getMessage());
		}
	}
}
  



  Jscript COM 版

  
cscript lang_08.js
  
↑実行

  
// オブジェクト作成
var WshShell = new ActiveXObject("WScript.Shell");
var Fso = new ActiveXObject( "Scripting.FileSystemObject" );

// システム環境変数を取得
var WshSysEnv = WshShell.Environment("SYSTEM");
var strEnvPath = WshSysEnv("PATH");

// ユーザー環境変数を取得
WshSysEnv = WshShell.Environment("USER");

strEnvPath += ";" + WshSysEnv("PATH");

// トークンに分解
var aData = strEnvPath.split( ";" );

// ソート
aData = aData.sort();

// テキストファイルに書き込む
var OutObj = Fso.OpenTextFile( "result.txt", 2, true );
for (key in aData) {

	OutObj.WriteLine( aData[key] );

}
OutObj.Close();
  



  Jscript Framework 版

  
jsc lang_09.js
  
↑ビルド

  
import System;
import System.IO;


// PATH 環境変数取得
var strEnv : String = Environment.GetEnvironmentVariable( "PATH" );

// 区切り文字定義
var delimStr : String = ";";
var delimiter : Char[] = delimStr.ToCharArray();

// 配列定義
var split : String[];

// トークン分割
split = strEnv.Split( delimiter );

// ソート
System.Array.Sort( split );

var strValue,key

// 書き込み
try {
	var OutFile : StreamWriter = new StreamWriter("result.txt", false );
	for (key in split) {
		OutFile.WriteLine( split[key] );
	}
	OutFile.Flush();
	OutFile.Close();
}
catch( e ) {
	Console.WriteLine("エラーの内容 : {0}", e.ToString());
}
  



  php5 版

  
php.exe lang_10.php
  
↑実行

  
<?

$str = getenv("PATH");

$data = mb_split( ';', $str );

sort($data);

$data = implode( "\r\n", $data ) . "\r\n";

@file_put_contents( "result.txt", $data );

?>
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ