VBScriptで「環境変数」の値を取得する場合は、シェルオブジェクトの「ExpandEnvironmentStrings」メソッドを使用する。
使い方は以下のよう。
Option Explicit '変数 Dim objShell Dim tmp 'シェルオブジェクト作成 Set objShell = CreateObject("WScript.Shell") '環境変数取得 tmp = objShell.ExpandEnvironmentStrings("%TMP%") '環境変数表示 WScript.Echo tmp 'シェルオブジェクト破棄 Set objShell = Nothing
コメント
管理人様
はじめまして
質問させて下さい。
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
================================================
管理人様
ありがとうございます。
仰る通り、Win7ではコピーできますが
Win8.1だとエラーになります。
エラーにならないようにはできませんでしょうか?
宜しくお願い致します。
エラーというのは権限がないという内容のエラーで、管理者で実行しても同じということですか?
Windows 8.1がないので確認できませんが、Program Filesフォルダは特殊な扱いで、ユーザーアカウント制御(UAC)が関係してたような気がします。
「Windows 8.1 Program Files UAC」あたりでググってみてください。
連投すいません。
削除の方なのですが、
‘———————————————————————-
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の場合
エラー
======================
管理人様
ありがとうございます。
差し支えなければ例のコードを提示していただけないでしょうか?
宜しくお願いします。