Cmd Exe から Cscriptで起動を推奨します
VBScript名はD:\environ.vbsとします
特に出力先フォルダを環境変数を使って指定するというのがよいようです。
vbsを作成して保存します。
WIN+Rから Cmd enterでおなじみの黒い画面を出します。
そして次のように入力します。コピーして右クリックでもいいかもしれません。
cscript //nologo environ.vbs >D:\Log%date:~0,4%%date:~5,2%%date:~8,2%%time:~-10,1%%time:~-8,2%%time:~-5,2%%time:~-2%.txt
黒い窓が何回か開きます
動的環境変数は Echo clipで取得するためです
この動的環境変数は Wsh.exec stdOut.readAllが効きません。
このため、何回か窓が開きます。
環境変数の様々な分類で出力されます
Environmentのコレクション Process, System , User, Volatile, Setの分類で出力されます。どのジャンルに属しているか、特にwsh.expandenvironmentsringは実はProcessの分にしか効きません。したがってExpandでAMD64は取得できません。環境変数がそのまま帰ります。
下記はConstを使って環境変数を短くしています。
'Wscript.Echo wsh.ExpandEnvironmentStrings(wshAMD64) & "wshAMD64 get Fialed. "
どれがProcessの分かすぐわかるようになります。
動的環境変数を取得します
このサンプルがないので頭を悩ませましたが、EchoからClipで取得できます。 stdOutはダメでした。
おまけもかねてバージョン情報も
Wscript.Echo wsh.Exec("cmd /c ver").StdOut.ReadAll
この部分です。このように動的環境変数も簡単に取得出来たらずいぶん楽になるのですが。
コマンド拡張機能が有効な場合、SET によって表示される変数の一覧には
現れないいくつかの動的な環境変数があります。
これらの変数の値は、変数の値が展開されるときに
動的に計算されます。
ユーザーがこれらの名前の変数を明示的に定義する場合、
その定義は下記の動的な定義を無効にします。
環境変数のConst Wscript Shell Runの窓定数
とりあえず作りました。
環境変数を使った場合のWscript Shell Run Cmd.exeの書き換え方
いくつかコメントアウトしているものは一応動きました
Clipboardのクリアはうまくいかない
Clearの行が出てしまいますが、どちらにしろゼロが出るので、ここは仕様です。
ダブルクリック、Wscript起動してもはっきり見えません
Wscriptは強制的にCscriptに再起動し、Cscriptは自動的に閉じます。素人がハッキングなどには使えない仕様となっています。
参考文献
コマンドプロンプトの標準出力を取得
Windows Vista Later VBScript Boot 64 bit Or 32 bit with Cscript or WScript Which you want to VBScriptを64bit 32bitのCscript Wscriptの起動を使い分ける
今回のものはSysnativeを使用していないため、Vista以前でも大丈夫です。
WScript.exe および CScript.exe のオプション
Run メソッド
%RANDOM% -ss64
クリップボードを操作する(2)
Clipboardのクリア方法
Windowsバッチファイル実行結果の取得
Windows環境変数
本来の環境変数はバッチファイルのもの。
VBScript HTML上でクリップボードを操作する-VBScript
そう、VBSってHPで使えたんだよ...
Windows Environment Variables - SS64
バッチファイルからVBS呼び出しの引数の渡し方、および戻り値の受け取り方について
バッチファイルとVBSでの引数と戻り値のやりとりの方法。ただし1個しか渡せないなど制約が大きい。
VBScript
'もし、64bit OS Wscript Or 32bit CScipt Wscript で起動されたら、自身を64bit cscript.exeで起動し直す。
IF LCase(CreateObject("WScript.Shell").Environment("Process").Item("PROCESSOR_ARCHITECTURE"))="amd64" Then
If InStr(LCase(WScript.FullName),"syswow64") OR InStr(LCase(WScript.FullName),"wscript.exe") Then
' CreateObject("WScript.Shell").Run """" & Replace(Replace(LCase(WScript.FullName),"syswow64","sysnative"),"wscript.exe","cscript.exe") & """ //Nologo """ & WScript.ScriptFullName & """ | Clip """ 'Safe but not effective
CreateObject("WScript.Shell").Run """" & Replace(Replace(LCase(WScript.FullName),"syswow64","sysnative"),"wscript.exe","cscript.exe") & """ //Nologo """ & WScript.ScriptFullName & """"
WScript.Quit
End If
Else
'32bit OSの場合はCscriptにする
If InStr(LCase(WScript.FullName),"wscript.exe") Then
CreateObject("WScript.Shell").Run """" & Replace(LCase(WScript.FullName),"wscript.exe","cscript.exe") & """ //Nologo """ & WScript.ScriptFullName & """"
WScript.Quit
End If
End If
Const WaitSpan = 100 'milliseconds Cscript Needs at Least 100
'Window Style Const
Const wshRunEnum_ThisWindowHiddenOtherWindowActive = 0 '(起動した)ウィンドウを非表示にし、別のウィンドウをアクティブにします。
Const wshRunEnum_ThisWindowDisplayNormal = 1 '(起動した)ウィンドウをアクティブにして表示します。ウィンドウが最小化または最大化されている場合は、元のサイズと位置に戻ります。アプリケーションでウィンドウを最初に表示するときには、このフラグを指定してください。
Const wshRunEnum_ThisWindowShowMinimize = 2 '(起動した)ウィンドウをアクティブにし、最小化ウィンドウとして表示します。
Const wshRunEnum_ThisWindowShowMaximize = 3 '2の逆で最大化して表示
Const wshRunEnum_ThisWindowShowButNonActive = 4 '(起動した)ウィンドウを最新のサイズと位置で表示します。アクティブなウィンドウは切り替わりません。’
Const wshRunEnum_ThisWindowShow = 5 '(起動した)ウィンドウをアクティブにし、現在のサイズと位置で表示します。
Const wshRunEnum_WindowMinimizeZOderTopActive = 6 '指定したウィンドウを最小化し、Z オーダー上で次に上位となるウィンドウをアクティブにします。
Const wshRunEnum_MimizeWindowNonActive = 7 '(起動した)ウィンドウを最小化ウィンドウとして表示します。アクティブなウィンドウは切り替わりません。
Const wshRunEnum_ShowCurrentWindowNonActive = 8 '(起動した)ウィンドウを現在の状態で表示します。アクティブなウィンドウは切り替わりません。
Const wshRunEnum_ShowThisWindowActiveSizeNormal = 9 'ウィンドウをアクティブにして表示します。ウィンドウが最小化または最大化されている場合は、元のサイズと位置に戻ります。アプリケーションで最小化ウィンドウを復元するときには、このフラグを指定してください。
Const wshRunEnum_AppWindowSizebyApp = 10 '
'Wscript Shell ExpandEnvironmentStrings Enum
Const wshEnvWindir = "%WINDIR%"
Const wshEnvProgram = "%CommonProgramFiles%"
Const wshEnvProgram86 = "%CommonProgramFiles(x86)%"
Const wshEnvW6432 = "%CommonProgramW6432%"
Const wshEnvCOMPUNAME = "%COMPUTERNAME%"
Const wshEnv = "%COMSPEC%"
Const envCMDC = "%COMSPEC% /C "
Const wshEnvUN = "%USERNAME%"
Const wshEnvUProf = "%USERPROFILE%" 'Documetフォルダの取得
Const wshAMD64 = "PROCESSOR_ARCHITECTURE" 'AMD64=64 Bit OS 64bitの判定に使う
Const wshDir = "%WINDIR%"
Const wshPrPt = "%PROMPT%"
Const wshTMP = "%TEMP%"
Const wshEnvPub = "%PUBLIC%"
Const wshEnvSysD = "%SystemDrive%"
Const wshEnvNumProssesor = "%NUMBER_OF_PROCESSORS%"
Const wshEnvLocalApp = "%LOCALAPPDATA%"
Const wshEnvHOMEDRIVE = "%HOMEDRIVE%"
Const wshEnvHOMEPATH = "%HOMEPATH%"
'Command Expand
Const DEnvRnd = "%RANDOM%" 'Generate 0 to 32767 Decimal Number
Const EnvDAY = "%DATE%" 'DATE コマンドと同じフォーマットで現在の日付に展開します。(コントロールパネルの設定に依拠します)
Const EnvNow = "%TIME%" 'TIME コマンドと同じフォーマットで現在の時刻に展開します。(コントロールパネルの設定に依拠します)
Const EnvCD = "%CD%" '現在のディレクトリ文字列に展開します。
Const EnvERRLV = "%ERRORLEVEL%" '現在の ERRORLEVEL の値に展開します。
Const DEnvCMDEX = "%CMDEXTVERSION%" '現在のコマンド プロセッサ拡張機能のバージョン番号に展開します。
Const DEnvCMD2 = "%CMDCMDLINE%" 'コマンド プロセッサを起動したオリジナル コマンド ラインに展開します。
Const DEnvHi = "%HIGHESTNUMANODENUMBER%" 'このコンピューター上の最大の NUMA ノード番号に展開します。
'''' Main Block ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim WSH : Set WSH=CreateObject("WScript.Shell")
Dim WshSysEnv : Set WshSysEnv =wsh.Environment("SYSTEM")
Dim WshProcEnv : Set WshProcEnv =wsh.Environment("Process")
Dim WshUserEnv : Set WshUserEnv =wsh.Environment("User")
Dim WshVolaEnv : Set WshVolaEnv = wsh.Environment("Volatile")
Dim wshExec,sCmd,LinesCnt
Dim objEnvironment, strEnvironment, strOutput
Dim objHTML,clpTEXT : Set objHTML = CreateObject("htmlfile")
'/////// Environment Variables Collection List //////
'WshEnvironmentコレクションを変数に格納
strOutPut = "" : strOutput =String(70,"-") & vbCrLf & " Environment Variables Collection List " & vbCrLf & String(70,"-") & vbCrLf
Wscript.Echo strOutPut
strOutput=""
Set objEnvironment = Wsh.Environment
'コレクションの値を列挙
For Each strEnvironment In objEnvironment
strOutput = strOutput & strEnvironment & vbCrLf
Next
Wscript.Echo strOutput & vbcRlf & String(70,"-")
'/////// Process Variables Collection List //////
'WshEnvironmentコレクションを変数に格納
strOutPut = "" : strOutput =String(70,"-") & vbCrLf & "Process Environment Variables Collection List " & vbCrLf & String(70,"-") & vbCrLf
Wscript.Echo strOutPut
strOutput=""
Set objEnvironment = WshProcEnv
'コレクションの値を列挙
For Each strEnvironment In objEnvironment
strOutput = strOutput & strEnvironment & vbCrLf
Next
Wscript.Echo strOutput & vbcRlf & String(70,"-")
'///////System Environment Variables Collection List //////
strOutPut = ""
'WshEnvironmentSystemコレクションを変数に格納
strOutPut = ">>" & vbTab & "System Environ " & vbCrlf & String(70,"-") & vbCrLf
'コレクションの値を列挙
For Each strEnvironment In WshSysEnv
strOutput = strOutput & strEnvironment & vbCrLf
Next
Wscript.Echo strOutput & vbcRlf & String(70,"-")
'/////// User Environment Variables List //////
strOutPut = ""
'WshEnvironmentUserコレクションを変数に格納
strOutPut = ">>" & vbTab & "User Environment Variables " & vbCrlf & String(70,"-") & vbCrLf
'コレクションの値を列挙
For Each strEnvironment In WshUserEnv
strOutput = strOutput & strEnvironment & vbCrLf
Next
Wscript.Echo strOutput & vbcRlf & String(70,"-")
strOutPut = ""
'/////// Volatile Environment Variables List //////
strOutPut = ""
'WshEnvironmentVolatileコレクションを変数に格納
strOutPut = "Volatile Environ Variable List" & vbCrlf & String(70,"-") & vbCrLf
'コレクションの値を列挙
For Each strEnvironment In WshVolaEnv
strOutput = strOutput & strEnvironment & vbCrLf
Next
Wscript.Echo strOutput & vbcRlf & String(70,"-")
Wscript.Echo ">>" & vbTab & "Set Command Output Result" & vbcRlf & String(70,"-")
' Set Command result Output
sCmd = "Cmd /c ""Set""" : 'Wscript.Echo sCmd
wshExec= WSH.exec(sCmd).StdOut.ReadAll : wscript.sleep WaitSpan *2
Wscript.Echo wshExec
'sCmd = "Cmd /c ""echo %date% > E:\date.txt""" : Wscript.Echo sCmd, 131 : LinesCnt = 131 +2
'WSH.run sCmd
Wscript.Echo wshExec , LinesCnt : LinesCnt = LinesCnt +1
'ファイルに出力する場合(参考)
'wsh.Run "Cmd /c ""echo %date%%time%>D:\Log%date:~0,4%%date:~5,2%%date:~8,2%%time:~-10,1%%time:~-8,2%%time:~-5,2%%time:~-2%.txt"""
Wscript.Echo WshProcEnv.Item(wshAMD64) ,136 : LinesCnt=136 +1 'Process以外はこのように名前でピンポイントで出力する
Wscript.Echo WshSysEnv.Item(wshEnvHOMEPATH) , LinesCnt : LinesCnt = LinesCnt +1
Wscript.Echo wsh.ExpandEnvironmentStrings(wshEnvProgram), LinesCnt : LinesCnt = LinesCnt +1
Wscript.Echo wsh.ExpandEnvironmentStrings(wshEnvProgram86), LinesCnt : LinesCnt = LinesCnt +1
Wscript.Echo wsh.ExpandEnvironmentStrings(wshEnvProgram), LinesCnt : LinesCnt = LinesCnt +1
Wscript.Echo wsh.ExpandEnvironmentStrings(wshEnvUN) , LinesCnt : LinesCnt = LinesCnt +1
Wscript.Echo wsh.ExpandEnvironmentStrings(wshEnvLocalApp) , LinesCnt : LinesCnt = LinesCnt +1
Wscript.Echo wsh.ExpandEnvironmentStrings(wshTMP) , LinesCnt : LinesCnt = LinesCnt +1
Wscript.Echo wsh.ExpandEnvironmentStrings(wshDir), LinesCnt : LinesCnt = LinesCnt +3
'Wscript.Echo wshProcEnv(wshEnvSysD) , LinesCnt : LinesCnt = LinesCnt +1
'Wscript.Echo WshSysEnv.Item(wshPrPt) ,"Propmpt get :Failed. " , LinesCnt : LinesCnt = LinesCnt +1'不可
'Wscript.Echo wsh.ExpandEnvironmentStrings(wshAMD64) & "wshAMD64 get Fialed. " , LinesCnt : LinesCnt = LinesCnt +1 '不可
Wscript.Echo wsh.Exec("cmd /c ver").StdOut.ReadAll
If objHTML.ParentWindow.ClipboardData.GetData("text") <>"" Then objHTML.ParentWindow.ClipboardData.ClearData "text"
wsh.Run "Cmd /c ""echo %date%%time% | Clip""" : Wscript.Sleep WaitSpan
clpTEXT = Trim(objHTML.ParentWindow.ClipboardData.GetData("text"))
Wscript.Echo clpText
wsh.Run "Cmd /c ""echo %CD% | Clip""" , wshRunEnum_ThisWindowHiddenOtherWindowActive, True :Wscript.Sleep WaitSpan
clpTEXT = Trim(objHTML.ParentWindow.ClipboardData.GetData("text"))
Wscript.Echo EnvCD & ": " & vbTAB & clpText
'wsh.Run "Cmd /c ""echo """ & DEnvRnd & """ | Clip"""" , wshRunEnum_ThisWindowHiddenOtherWindowActive, true : wscript.sleep WaitSpan
wsh.Run envCMDC & """echo " & DEnvRnd & " | Clip""", wshRunEnum_ThisWindowHiddenOtherWindowActive, true : wscript.sleep WaitSpan
clpTEXT = Trim(objHTML.ParentWindow.ClipboardData.GetData("text"))
Wscript.Echo DEnvRnd & " :" & vbtab & clpText
wsh.Run envCMDC & """echo " & DEnvCMDEX & " | Clip""", wshRunEnum_ThisWindowHiddenOtherWindowActive, true : wscript.sleep WaitSpan
clpTEXT = Trim(objHTML.ParentWindow.ClipboardData.GetData("text"))
Wscript.Echo "%CMDEXTVERSION% :" & vbTab & clptext
'環境変数から定数への変換
'wsh.Run "Cmd /c ""echo %CMDCMDLINE% | Clip""" , wshRunEnum_MimizeWindowNonActive, True : wscript.sleep WaitSpan *2
'wsh.Run wshEnv & " /C " & """echo " & DEnvCMD2 & " | Clip""", 7, true : wscript.sleep WaitSpan
wsh.Run envCMDC & """echo " & DEnvCMD2 & " | Clip""", wshRunEnum_ThisWindowHiddenOtherWindowActive, true : wscript.sleep WaitSpan
clpTEXT = Trim(objHTML.ParentWindow.ClipboardData.GetData("text"))
Wscript.Echo "%CMDCMDLINE% :" & vbTab & clpText
wsh.Run wshEnv & " /C " & """echo " & DEnvHi & " | Clip""", wshRunEnum_ThisWindowHiddenOtherWindowActive, true : wscript.sleep WaitSpan
clpTEXT = Trim(objHTML.ParentWindow.ClipboardData.GetData("text"))
Wscript.Echo DEnvHi & " :" & vbtab & clpText
'wsh.Run "Cmd /c ""echo %ERRORLEVEL% | Clip""" , wshRunEnum_MimizeWindowNonActive, True : wscript.sleep WaitSpan *2
wsh.Run wshEnv & " /C " & """echo " & EnvERRLV & " | Clip""", wshRunEnum_ThisWindowHiddenOtherWindowActive, true : wscript.sleep WaitSpan
clpTEXT = Trim(objHTML.ParentWindow.ClipboardData.GetData("text"))
Wscript.Echo "%ERRORLEVEL% :" & vbTab & clpText
Set WSH= Nothing
Set objHTML = Nothing
Wscript.Quit