VBScriptで環境変数の値を取得する方法

VBScriptプログラミング
この記事は約1分で読めます。

VBScriptで「環境変数」の値を取得する場合は、シェルオブジェクトの「ExpandEnvironmentStrings」メソッドを使用する。

使い方は以下のよう。

Option Explicit

'変数
Dim objShell
Dim tmp

'シェルオブジェクト作成
Set objShell = CreateObject("WScript.Shell")

'環境変数取得
tmp = objShell.ExpandEnvironmentStrings("%TMP%")

'環境変数表示
WScript.Echo tmp

'シェルオブジェクト破棄
Set objShell = Nothing

参考サイト

VBScript Tips (Tips0115)

プログラミング
えふめん

大阪在住、30代。
業務系SE・社内SEの仕事を通じて学んだこと、PCトラブルで困って調べたこと、手作業を効率化して改善したこと、WordPressのブログ運営などの記事を書いています。

えふめんをフォローする
\よかったらシェアしてね/
この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
俺の開発研究所

コメント

  1. VBS より:

    管理人様
    はじめまして
    質問させて下さい。

    C:\Users\ユーザー名\Desktop\AAA\a.txt ‘隠しファイル
    C:\Users\ユーザー名\Desktop\AAA\b.txt ‘隠しファイル

    上の2つのファイルを、C:\PROGRA~2\bbb\にコピー(上書き)したいのですが
    %username%でエラーがでます。
    どのように記述すれば良いのでしょうか?
    宜しければ教えて下さいませ。

    下記は、エラーが出るコードです。
    宜しくお願い致します。

    ‘——————————————————————————–
    Dim Fso
    Set Fso = CreateObject(“Scripting.FileSystemObject”)
    Fso.CopyFile “C:\Users\%username%\Desktop\AAA\a.txt”, “C:\PROGRA~2\bbb\”
    Fso.CopyFile “C:\Users\%username%\Desktop\AAA\b.txt”, “C:\PROGRA~2\bbb\”
    Set Fso = Nothing

    Dim fs
    Dim fn
    Set fs = WScript.CreateObject(“Scripting.FileSystemObject”)
    Set fn = fs.GetFile(“C:\PROGRA~2\bbb\a.txt”)
    fn.attributes = 0

    Set fs = WScript.CreateObject(“Scripting.FileSystemObject”)
    Set fn = fs.GetFile(“C:\PROGRA~2\bbb\b.txt”)
    fn.attributes = 0
    ‘——————————————————————————–

    • えふめん より:

      コメントありがとうございます。
      Windows10で実行してみました。
      コマンドプロンプトを開いてsetコマンドで環境変数USERNAMEに値が入っていることは確認できましたが、VBS内で「Wscript.Echo %USERNAME%」としてもその環境変数の値は展開されませんでした。
      ですので、WScript.ShellオブジェクトのExpandEnvironmentStrings関数で取得してみました。
      以下のように修正しました。

      あと、「C:\Program Files」以下にファイル作成する場合は、管理者として実行しないとエラーになると思います。

      ================================================
      Dim Fso
      Dim Shell
      Set Fso = CreateObject(“Scripting.FileSystemObject”)
      set Shell = WScript.CreateObject(“WScript.Shell”)
      username = Shell.ExpandEnvironmentStrings(“%USERNAME%”)
      Fso.CopyFile “C:\Users\” & username & “\Desktop\AAA\a.txt”, “C:\PROGRA~2\bbb\”
      Fso.CopyFile “C:\Users\” & username & “\Desktop\AAA\b.txt”, “C:\PROGRA~2\bbb\”
      Set Fso = Nothing

      Dim fs
      Dim fn
      Set fs = WScript.CreateObject(“Scripting.FileSystemObject”)
      Set fn = fs.GetFile(“C:\PROGRA~2\bbb\a.txt”)
      fn.attributes = 0

      Set fs = WScript.CreateObject(“Scripting.FileSystemObject”)
      Set fn = fs.GetFile(“C:\PROGRA~2\bbb\b.txt”)
      fn.attributes = 0
      ================================================

  2. VBS より:

    管理人様
    ありがとうございます。

    仰る通り、Win7ではコピーできますが
    Win8.1だとエラーになります。
    エラーにならないようにはできませんでしょうか?
    宜しくお願い致します。

    • えふめん より:

      エラーというのは権限がないという内容のエラーで、管理者で実行しても同じということですか?
      Windows 8.1がないので確認できませんが、Program Filesフォルダは特殊な扱いで、ユーザーアカウント制御(UAC)が関係してたような気がします。
      「Windows 8.1 Program Files UAC」あたりでググってみてください。

  3. VBS より:

    連投すいません。
    削除の方なのですが、
    ‘———————————————————————-
    Option Explicit
    On Error Resume Next

    Dim FSO
    Dim DelFile

    DelFile = “C:\PROGRA~2\bbb\*.ini”
    Set FSO = WScript.CreateObject(“Scripting.FileSystemObject”)
    If Err.Number = 0 Then
    FSO.DeleteFile DelFile, True
    If Err.Number = 0 Then
    WScript.Echo DelFile & ” を削除しました。”
    Else
    WScript.Echo “エラー: ” & Err.Description
    End If
    Else
    WScript.Echo “エラー: ” & Err.Description
    End If

    Set FSO = Nothing
    ‘———————————————————————-

    このコードで
    “C:\PROGRA~2\bbb\*.ini”を削除
    “C:\PROGRA~2\ccc\*.ini”を削除

    “C:\PROGRA~2\bbb\*.ini”にファイルがなければスルーし、
    “C:\PROGRA~2\ccc\*.ini”を削除して完了。

    “C:\PROGRA~2\ccc\*.ini”にファイルがなければスルーし、
    “C:\PROGRA~2\bbb\*.ini”を削除して完了。

    両方のフォルダ内にファイルがなければ、
    WScript.Echo “エラー: ” & Err.Description

    このようなことは可能でしょうか?
    教えて下さいませ。
    宜しくお願い致します。

    • えふめん より:

      FileSystemObjectのFileExists関数でファイルの存在チェックはできるようですが、*のワイルドカードは使用できないようです。
      なので、フォルダ内のファイルを取得してループ、拡張子.iniかどうか判定すればいいかと。
      DeleteFile関数は*のワイルドカード使用可らしいです。
      以下のようにすればいいのでは。
      両方のフォルダにあった場合どうするのか分かりませんが。

      ======================
      「C:\PROGRA~2\bbb\」のファイル一覧をループ
       拡張子.iniか判定し、bbbの結果をフラグ変数に保持
      ループ終了

      「C:\PROGRA~2\ccc\」のファイル一覧をループ
       拡張子.iniか判定し、cccの結果をフラグ変数に保持
      ループ終了

      bbbの結果 = True かつ cccの結果 = Falseの場合
       「C:\PROGRA~2\bbb\*.ini」をDeleteFile関数で削除
      bbbの結果 = False かつ cccの結果 = Trueの場合
       「C:\PROGRA~2\ccc\*.ini」をDeleteFile関数で削除
      bbbの結果 = False かつ cccの結果 = Falseの場合
       エラー
      ======================

  4. VBS より:

    管理人様
    ありがとうございます。

    差し支えなければ例のコードを提示していただけないでしょうか?
    宜しくお願いします。

タイトルとURLをコピーしました