2013年08月07日


XCOPY.EXE を使用した、『新しいファイルのみのバックアップ』を行うスクリプト

バックアップ先は、例えばリムーバルの保存用のハードディスクとすると、そこにこのスクリプトを置いてフォルダ名を決定して実行すると、そのフォルダの中にバックアップされます。

2回目以降は、新しいファイルしかバックアップされないので、新しいファイルが無い場合は『0 個のファイルをコピーしました』と表示されます

バックアップするフォルダのパスは、フルパスで設定しますが、ネットワークドライブが対象である事を想定しています。ですから、事前に仮想ドライブを設定する処理を追加する事もありますし、\\PC名\共有 という書き方でもかまいません。
Set WshShell = WScript.CreateObject("WScript.Shell")

Dim strCommand,strMessage
Dim strFrom,strTo

' コピー元
strFrom = "バックアップするフォルダのパス"
' コピー先
strTo = "バックアップ先"

' **********************************************
' 実行確認ダイアログ
' **********************************************
strMessage = strFrom & " の内容を   " & vbCrLf
strMessage = strMessage & strTo & " へ   " & vbCrLf
strMessage = strMessage & "新しいファイルのみコピーします" & vbCrLf & vbCrLf
strMessage = strMessage & "よろしいですか?"
if vbCancel = MsgBox( strMessage, vbOKCancel, "実行確認") then
	Wscript.Quit
end if

' **********************************************
' XCOPY
' **********************************************
strCommand = "cmd.exe /c XCOPY """ & strFrom & """ """ & strTo & """"
strCommand = strCommand & " /D /E /C /S /Y & echo 処理が終了しました & pause"
Call WshShell.Run( strCommand,, True )




posted by at 10:56 | Comment(0) | ツール | このブログの読者になる | 更新情報をチェックする


2013年01月19日


VBScript の既定のスクリプトホストの変更

『スクリプトホスト』は、.vbs と .wsf という拡張子に関係付けられた、VBScript のソースコードを読み込んで実行するアプリケーションの事です。

VBScript では、cscript.exewscript.exe という二つのスクリプトホストがあり、前者はコマンドプロンプト用で、後者は Windows アプリケーション用で、実際どのような違いが出るかというと、Wscript.echo という処理が、前者では標準出力に出力されるのに対して、後者ではメッセージボックスに出力されるというところです。

当然、コマンドプロンプトを前提にして作成されたスクリプトで Wscript.echo が使われていると、Windows アプリケーションでは、メッセージボックスが表示されつづけるという問題が出てしまいます。ですから、どちらのスクリプトホストで実行されるかは良く考えて運用する必要があるわけです。

そもそも、デフォルトのスクリプトホストは、Windows アプリケーションとして起動されるので、エクスプローラから開いた場合は Windows アプリケーションとして実行されてしまいます。これらの問題を避けるには、いずれかのスクリプトホストを //H:CScript 引数を付けて実行するとデフォルトのスクリプトホストが変更されます( 戻す場合は //H:WScript で実行 )

さらに、これらの設定の大元はレジストリの記述なので、そこを変更してしまうと前述の切り替えを行わなくても同じ効果を得る事ができてしまいますが、元に戻すには直接レジストリを書き換える必要があります。
( 以下は、.vbs 用で、.wsf は WSFFile というエントリが別にあって管理されています )
HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command
HKEY_CLASSES_ROOT\VBSFile\Shell\Open2\Command

または

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\VBSFile\Shell\Open\Command
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\VBSFile\Shell\Open2\Command
>reg query HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command

HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command
    (既定)    REG_EXPAND_SZ    "%SystemRoot%\System32\WScript.exe" "%1" %*


>reg query HKEY_CLASSES_ROOT\VBSFile\Shell\Open2\Command

HKEY_CLASSES_ROOT\VBSFile\Shell\Open2\Command
    (既定)    REG_EXPAND_SZ    "%SystemRoot%\System32\CScript.exe" "%1" %*
>cscript /?
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

使い方 : CScript scriptname.extension [オプション...] [引数...]

オプション :
 //B         バッチ モード : スクリプトのエラーおよびプロンプトを非表示にする
 //D         アクティブ デバッグを使用可能にする
 //E:engine  スクリプト実行時にエンジンを使用する
 //H:CScript 既定のスクリプト ホストを CScript.exe に変更する
 //H:WScript 既定のスクリプト ホストを WScript.exe に変更する (既定値)
 //I         対話モード (既定値、//B と逆の動作)
 //Job:xxxx  WSF ジョブを実行する
 //Logo      ロゴを表示する (既定値)
 //Nologo    ロゴを表示しない : 実行時に見出しを表示しない
 //S         このユーザーの現在のコマンド ライン オプションを保存する
 //T:nn      秒単位のタイムアウト時間 :  スクリプトを実行できる時間の最大値
 //X         デバッガでスクリプトを実行する
 //U         コンソールからリダイレクトされた I/O に Unicode を使用する



タグ:WScript cscript
posted by at 02:30 | Comment(0) | 基本事項 | このブログの読者になる | 更新情報をチェックする


2011年12月16日


ユーザー環境変数の設定

PC名とユーザ名が必要です
' **********************************************************
' PC 名と ユーザ名を取得
' **********************************************************
Dim WshNetwork : Set WshNetwork = CreateObject( "WScript.Network" )
Dim strUser : strUser = WshNetwork.UserName
Dim strMachine : strMachine = WshNetwork.ComputerName

Dim strComputer : strComputer = "."
Dim obj : Set obj = GetObject("winmgmts:\\"&strComputer&"\root\cimv2")


' **********************************************************
' ユーザ環境変数を登録
' **********************************************************
Dim objEnv : Set objEnv = obj.Get("Win32_Environment").SpawnInstance_

objEnv.Name = "MyENV"
objEnv.UserName = strMachine & "\" & strUser
objEnv.VariableValue = "設定しました"
objEnv.Put_



posted by at 09:10 | Comment(0) | WMI | このブログの読者になる | 更新情報をチェックする



システム環境変数とユーザー環境変数の列挙

select * from Win32_Environment where SystemVariable = True and Name = 'PATH'
というクエリで、SystemVariable を True にするとシステム変数です
Dim strValue : strValue = ""

Dim strComputer : strComputer = "."
Dim obj : Set obj = GetObject("winmgmts:\\"&strComputer&"\root\cimv2")

' **********************************************************
' システム環境変数
' **********************************************************
Dim objItems : Set objItems = obj.ExecQuery _
   ("select * from Win32_Environment where SystemVariable = True and Name = 'PATH'")

Dim objItem
For Each objItem in objItems
	strValue = objItem.VariableValue
Next

Dim I,aData
if strValue <> "" then
	aData = Split( strValue, ";" )

	strValue = ""
	For I = 0 to Ubound( aData )
		strValue = strValue & aData(I) & vbCrLf
	Next

	Wscript.Echo strValue
end if

' **********************************************************
' ユーザー環境変数
' **********************************************************
Set objItems = obj.ExecQuery _
   ("select * from Win32_Environment where SystemVariable = False and Name = 'PATH'")

For Each objItem in objItems
	strValue = objItem.VariableValue
Next

if strValue <> "" then
	aData = Split( strValue, ";" )

	strValue = ""
	For I = 0 to Ubound( aData )
		strValue = strValue & aData(I) & vbCrLf
	Next

	Wscript.Echo strValue
end if




posted by at 09:01 | Comment(0) | WMI | このブログの読者になる | 更新情報をチェックする



PC 名と ユーザ名を取得

VBScript では、Dim で変数を定義した時に初期値をセットできないので、:(コロン) を使って横書きにして、同じような記述にしています
' **********************************************************
' PC 名と ユーザ名を取得
' **********************************************************
Dim WshNetwork : Set WshNetwork = CreateObject( "WScript.Network" )
Dim strUser : strUser = WshNetwork.UserName
Dim strMachine : strMachine = WshNetwork.ComputerName

Wscript.Echo strUser & " : " & strMachine




posted by at 08:44 | Comment(0) | WSHのオブジェクト | このブログの読者になる | 更新情報をチェックする



ADO を使ったメモリソート

Microsoft のドキュメントでは、255 を越える場合に可変長となると書かれていましたが、どうも違うようです。
' Null で終了する Unicode 文字列を示します (DBTYPE_WSTR)。
Const adWChar = 130

Dim Rs

Set Rs = Wscript.CreateObject("ADODB.Recordset")
' 127 までは固定長として扱われました
' 128 以上は可変長のはずです
Rs.Fields.Append "ソートキー", adWChar,128
Rs.Fields.Append "ソートデータ", adWChar,128
Rs.Open

Rs.AddNew
Rs.Fields("ソートキー").value = "C"
Rs.Fields("ソートデータ").value = "山田"
'Rs.Update : メモリ上なので無くても良いようです

Rs.AddNew
Rs.Fields("ソートキー").value = "A"
Rs.Fields("ソートデータ").value = "田中"
'Rs.Update

Rs.AddNew
Rs.Fields("ソートキー").value = "B"
Rs.Fields("ソートデータ").value = "鈴木"
'Rs.Update

Rs.Sort = "ソートキー"

Rs.MoveFirst

Dim strResult : strResult = ""
Do while not Rs.EOF

	strResult = strResult & Rs.Fields("ソートキー").Value & " : "
	strResult = strResult & Rs.Fields("ソートデータ").Value & vbCrLf

	Rs.MoveNext

Loop

Rs.Close

Wscript.Echo strResult


使用例

ODBC ドライバの列挙

Seesaa のカテゴリをソート(通常と逆順と記事が多い順)する VBScript で記述された IE 拡張



タグ:ADO
posted by at 01:23 | Comment(0) | ADO | このブログの読者になる | 更新情報をチェックする



XMLファイルの更新

このような XML を読み込んでデータを追加した後、
新しいファイルとして保存します
<?xml version="1.0" encoding="UTF-8"?>
<channel>
	<item>
		<title>タイトル</title>
		<link>対象URL</link>
		<description>内容の説明</description>
		<date>2011-12-14</date>
	</item>
</channel>



※ 更新した結果を IE で表示すると以下のようになりました

' DOM Object 作成
Set dom = Wscript.CreateObject("Msxml2.DOMDocument")

' 既存 XML 入力
dom.load( "index.xml" )

' 既存のノード( channel ) を取得
Set nodeList = dom.getElementsByTagName("channel")

' 新規ノードを作成( createElement でも良い )
Set node = dom.createNode( 1, "item", "" )
' Set node = dom.createElement( "item" )

' **********************************************************
' title ノードを作成
' **********************************************************
Set nodeChild = dom.createElement("title")
nodeChild.appendChild( dom.createTextNode("これは") )
node.appendChild( nodeChild )

' **********************************************************
' link ノードを作成
' **********************************************************
Set nodeChild = dom.createElement("link")
nodeChild.appendChild( dom.createTextNode("SHIFT_JIS ですが") )
node.appendChild( nodeChild )

' **********************************************************
' description ノードを作成
' **********************************************************
Set nodeChild = dom.createElement("description")
nodeChild.appendChild( dom.createTextNode("オブジェクトになると") )
node.appendChild( nodeChild )

' **********************************************************
' dc:date ノードを作成
' **********************************************************
Set nodeChild = dom.createElement("date")
nodeChild.appendChild( dom.createTextNode("内部コードに変換されます") )
node.appendChild( nodeChild )


' channel ノードは、一つしか無いので、nodeList(0) で参照
' channel ノードの下に item ノードを追加
nodeList(0).appendChild( node )

' 保存
dom.save( "index2.xml" )



タグ:xml
posted by at 00:25 | Comment(0) | サンプル | このブログの読者になる | 更新情報をチェックする


2011年12月12日


実行されているスクリプトが存在するディレクトリのフルパスを取得する

strCurDir = WScript.ScriptFullName
strCurDir = Replace( strCurDir, "\" & WScript.ScriptName, "" )

でも動作しますが、以下のほうが正統派だとは思います
ソースツールバーの右端のダウンロードでダウンロードした場合は、キャラクタセットを SHIFT_JIS で保存しなおして、拡張子を .vbs に変更して下さい
Dim Fso,obj,strCurPath

' ファイルシステムオブジェクト
Set Fso = CreateObject( "Scripting.FileSystemObject" )

' 現在実行されているスクリプトのフルパス
strCurPath = WScript.ScriptFullName

' ファイルオブジェクトを作成
Set obj = Fso.GetFile( strCurPath )

' ファイルオブジェクトが存在するフォルダオブジェクト
Set obj = obj.ParentFolder

' そのフォルダのフルパス
strCurPath = obj.Path

Wscript.Echo strCurPath




posted by at 15:12 | Comment(0) | サンプル | このブログの読者になる | 更新情報をチェックする


2011年10月16日


VBScript の整数の入った配列をJavaScriptを使ってソートする

一つのソースで VBScript と JavaScript を混在させる必要があるので、ソースは .wsf の形式で記述します。

JavaScript では、VBArray というオブジェクトがあるので、それを使って少なくとも JavaScript 側で VBScript の配列をソートする事は容易です。

ただ、それを戻す方法が直接には無いのでカンマ区切りの文字列にしてVBScript 側に返して、VBScript 側ではその文字列を分解してから整数に戻して使用します
ソースツールバーの右端のダウンロードでダウンロードした場合は、キャラクタセットを SHIFT_JIS で保存しなおして、拡張子を .wsf に変更して下さい
<job>
<script language="JavaScript">

// ***********************************************************
// VBの整数値の入った配列をソートして文字列で返す
// ***********************************************************
function js_sort(aData) {

	var vb_obj = new VBArray(aData);

	var js_array = vb_obj.toArray();

	js_array.sort(sortFunction);

	var str = ""

	var i

	for( i = 0; i <= vb_obj.ubound(); i++ ) {
		if ( i != 0 ) {
			str += ","
		}
		str += js_array[i];
	}

	return str

}
// ***********************************************************
// 数値用の比較関数
// ***********************************************************
function sortFunction(a,b) {

	if( parseInt((a+"")) < parseInt((b+"")) ) {
		return -1;
	}
	if( parseInt((a+"")) > parseInt((b+"")) ) {
		return 1;
	}
	return 0;
}

</script>
<script language="VBScript">
' ***********************************************************
' 処理開始
' ***********************************************************

' 配列の準備
Dim aData(10)

' 単純に値をセット
aData(0) = 5
aData(1) = 1
aData(2) = 2
aData(3) = 6
aData(4) = 3
aData(5) = 4
aData(6) = 7
aData(7) = 10
aData(8) = 9
aData(9) = 8
aData(10) = 11

' ソートされた文字列を取得
str = js_sort( aData )

' 文字列として一旦分解
aData2 = Split(str,",")

' 正数値として入れ直す
For I = 0 to Ubound(aData2)
	aData2(I) = CLng(aData2(I))
Next

' 確認
For I = 0 to Ubound(aData2)
	Wscript.Echo aData2(I) * 10
Next

</script>

</job>





タグ:ソート
posted by at 21:54 | Comment(0) | JavaScript利用 | このブログの読者になる | 更新情報をチェックする


2011年10月14日


VBScript : ショートカットの作成

.lnk ファイルに対して Windows はファイルのパスを引数として渡すことを考慮する必要があります。ここでは、dump.vbs 35 の後ろにファイルのパスが追加されて実行されます。

※ この例は、SendTo(送る) フォルダにショートカットが置かれています
strSendto = WshShell.SpecialFolders("SendTo")
Set oShellLink = WshShell.CreateShortcut(strSendto & "\簡易ダンプ.lnk")

oShellLink.TargetPath = "%windir%\system32\wscript.exe"
' 引数の定義
oShellLink.Arguments = "dump.vbs 35"
oShellLink.WindowStyle = 1
oShellLink.IconLocation = "%SystemRoot%\system32\SHELL32.dll,55"
oShellLink.Description = "作成者 : lightbox"
oShellLink.WorkingDirectory = "dump.vbsが存在するパス"
oShellLink.Save


Microsoft の詳細ドキュメント

WshShortcut オブジェクト


posted by at 14:53 | Comment(0) | WSHのオブジェクト | このブログの読者になる | 更新情報をチェックする


×

この広告は180日以上新しい記事の投稿がないブログに表示されております。