WSHのCreateTextFileについて
- 初心者のためのWSHのCreateTextFileメソッドの使い方を質問します。
- VBscriptを使用してスクリプトファイルにテキストファイルを新規作成する方法について理解できません。
- ソースコードのGetBaseNameメソッドを使用してファイル名を生成しようとしたが上手く作成できません。
- ベストアンサー
WSHのCreateTextFileについて
プログラミングを学び始めて数か月の初心者です。 WSHにて、VBscriptを用いてスクリプトを製作しているのですが、 メソッドの動きが理解できないので質問させていただきます。 【実現したい処理】 ドラッグアンドドロップでスクリプトファイルにテキストファイルをドロップすると、 テキストファイル名に「_admin」を追加したテキストファイルを新規で作成する。 CreateTextFileメソッドを利用する際、 新規作成するファイル名をフルパスで指定すれば作成できます。 または、GetBaseNameメソッドを使用せず、変数にファイル名を直接代入すれば作成できます。 ソースの様に、GetBaseNameメソッドを利用してファイル名を生成すると上手くファイルを作成くれません。 このソースの場合、カレントフォルダに新規テキストファイルを作成することはできないのでしょうか。 宜しくお願いします。 【ソース CreateFile.vbs】 Dim objFSO, Dim strArgument, strFileName, strFileNewName Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") strArgument = WScript.Arguments(0) strFileName = objFSO.GetBaseName(strArgument) strFileNewName = strFileName & "_admin.txt" objFSO.CreateTextFile strFileNewName set objFSO = Nothing 【/ソース】
- twin-twin
- お礼率50% (1/2)
- Visual Basic
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
カレントフォルダ(スクリプトのあるフォルダ)に作成するのですね。 その点は勘違いしていました。申し訳ありません。 私のところでは、変数に直接ファイル名を代入してもエラーとなりました。 これは、VBScriptが実際にはCScript.exeまたはWScript.exeによって実行されるため、スクリプトにドロップするとカレントフォルダとしてWindows\System32が設定されるためと思われます。 ためしに、 CScript text.vbs %1 という内容のバッチファイルをスクリプト(こちらではtest.vbsという名前で保存してます)と同じフォルダにおいて、このバッチファイルにドロップするとうまくいきます。これは、バッチファイルのカレントフォルダがバッチファイルが存在するフォルダに設定されるためと思われます。 カレントフォルダをスクリプトが存在するフォルダに移動するコードを追加したところ、エラーは発生しませんでした。 dim objShell set objShell = CreateObject("WScript.Shell") objShell.CurrentDirectory = objFSO.GetParentFolderName(WScript.ScriptFullName)
その他の回答 (1)
- m-take0220
- ベストアンサー率61% (474/777)
GetBaseNameを使用すると、ファイルのフォルダ名がなくなってませんか? GetParentFolderNameでフォルダ名を取り出して連結すると、うまくいきませんか?
補足
回答ありがとうございます。 確かにGetBaseNameを使用するとフォルダ名は破棄されてしまっています。 フォルダ名も連結すると上手く作動します。 ただ、strFileNewFileNameに文字列"strFileName_admin.txt"を直接代入して、 CreateTextFileに渡すとスクリプトファイルがあるフォルダに新規作成されます。 GetBaseNameメソッドを使ってstrNewFileNameを生成した時と 文字列の中身は全く同じなのに(If文で確認しました。)、 生成されるファイルの保存場所が違うことに疑問を感じています。 その部分で回答できる部分があれば宜しくお願いします。
関連するQ&A
- VBSでフォルダ、ファイル作成時のエラーコード
フォルダ、ファイルが存在しないとき、作成するスクリプトをVBSで作成していますが、疑問点があるのでご教示ください。 objFSO.CreateFolder、objFSO.CreateTextFileを実行が、正常に行われた場合、 Err.Numberに0がセットされると思っていましたが、実際は違っていました。 objFSO.CreateFolderでフォルダが作成される場合、Err.Numberに13が返されます。 objFSO.CreateTextFileでファイルが作成される場合、Err.Numberに438が返されます。 このスクリプトを実行後、フォルダ、ファイルが存在しない場合、作成されることも確認しています。 フォルダ作成後、作成されたフォルダに対して、ファイルの作成/データの書き込みのアクセス権を拒否にすると返されるErr.numberに70がセットされることも確認しています。 なぜ、フォルダ、ファイルが作成された場合、0が返されないのかご存知の方がいらっしゃいましたらご教示ください。 また、その情報が記載されている書籍およびサイトがあれば、お教えいただければ、幸いです。 Option Explicit Dim objFSO Dim objFile Const strFolderName = "C:\VBS" Const strFileName = "C:\VBS\test.txt" On Error Resume Next Set objFSO = CreateObject("Scripting.FileSystemObject") If Err.Number = 0 Then WScript.Echo "FSOオブジェクトを作成しました" Else WScript.Echo "FSOオブジェクトを作成できませんでした" WScript.Quit(1) End If If objFSO.FolderExists(strFolderName) Then WScript.Echo "フォルダが見つかりました" Else WScript.Echo "フォルダが見つかりませんでした" If objFSO.CreateFolder(strFolderName) Then If Err.Number = 13 Then WScript.Echo "フォルダを作成しました" Else WScript.Echo "フォルダを作成できませんでした" WScript.Quit(1) End If End If End If If objFSO.FileExists(strFileName) Then WScript.Echo "ファイルが見つかりました" Else Script.Echo "ファイルが見つかりませんでした" If objFSO.CreateTextFile(strFileName) Then If Err.number = 438 Then WScript.Echo "ファイルを作成しました" Else WScript.Echo "ファイルを作成できませんでした" WScript.Quit(1) End If End If End If
- ベストアンサー
- Visual Basic
- VBSでファイル作成後、書き込みできない
ファイルが存在している場合は、ファイルをオープンして書き込み、ファイルが存在していない場合は、ファイルを作成後、オープンして書き込みを行わせたいと考えています。 しかし、ファイルが存在していないとき、ファイルは作成されるのですが、『エラー:800A0046 書き込みできません。VBScript実行時エラー』が出て、書き込みができません。モードをWritingにしても同じでした。 お手数をおかけしますが、ご教示いただけますようお願いいたします。 Option Explicit '■ オブジェクトの宣言 Dim objFSO Dim objFile '■ 定数の宣言 Const strFileName = "C:\VBS\TEST.TXT" '■ 定数の宣言 '// ファイル入出力モード(8:追加書き込み) Const ForAppending = 8 Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FileExists(strFileName) Then WScript.Echo "ファイルが見つかりました" Else WScript.Echo "ファイルが見つかりませんでした" Set objFile = objFSO.CreateTextFile(strFileName) If IsObject(objFile) Then WScript.Echo "ファイルを作成しました" Else WScript.Echo "ファイルを作成できませんでした" WScript.Quit(1) End If End If '// ファイルのオープン Set objFile = objFSO.OpenTextFile(strFileName,ForAppending) objFile.WriteLine "2012/12/21,100,ブレーキパッド,35000"
- ベストアンサー
- Visual Basic
- WSHのスタンバイが出来ない
windowsスクリプトホストを使ってスタンバイ アイコン が出来ません。操作方法を教えて下さい (1)PCはwin me 64MBです。 (2)テキストファイル の内容 dim objshell set objshell=wscript.createobject("shell. application") objshell.suspend c:\suspend.vbsとして保存しました。 (3)windows script 5.6をインストールしました。 (4)エラー表示 <オブジェクトでサポートされていないプロパティ または メソッドです。>となります。
- ベストアンサー
- Visual Basic
- WSH_フォルダ内の処理について
昨日から作成しているのですが、 新しく質問を立ち上げます。 下記のように、フォルダ内に格納してあるファイルを 取得できるのですが、フォルダ内で作成日時を見て 最新のファイル以外は削除させたい処理をやりたいです。 ファイル名を明示的に記載し比較はできるのですが、 フォルダ内の中から作成日時の最新のファイルを取得する っていうのができません。 下記ソースはイメージです。 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFolder = objFSO.GetFolder("C:\test") For Each objFile In objFolder.Files If objFile.type = ファイルタイプ Then 上記ファイルタイプで最新の日付のファイルを出力 上記ファイル以外削除 Else 上記ファイルタイプが存在しなければ何も処理を行わないず フォルダ内のファイル一覧を取得 WScript.Echo " " & objFile.Name Wscript.Echo "NG" End If Next 調べているのですが、簡単なソースしか作れません。 お願いします
- ベストアンサー
- その他(プログラミング・開発)
- 【VBS】 テキスト→HTML 自動作成
お世話になっております。 同じフォルダの中に入っているtxt全てを 自動的にHTML化しようと思っています。 分からないなりに考えて書いたのは下記コードです。 --------------------------------- Dim strScriptPath'自分の現在位置 strScriptPath = Replace(WScript.ScriptFullName,WScript.ScriptName,"")'フルネームから、スクリプトネームを削除! ' フォルダをオブジェクト取得 Set objFso = CreateObject("Scripting.FileSystemObject") Set objFolder = objFso.GetFolder(strScriptPath) for each file in objFolder.Files Set fileRead = objFSO.OpenTextFile(file)'ファイルを開く If file.name<> WScript.ScriptName Then 'Msgbox objFso.GetBaseName(file)ファイル名 Msgbox objFso.GetBaseName(file) Set HTMLOutPutData = objFso.CreateTextFile(objFso.GetBaseName(file) & ".html",True) 'If InStr(l, "本社") = 0 含んでない場合 'Replace(文字列,どれを、どれに) '<font color="green">文字列</font>緑色に If Err.Number = 0 Then HTMLOutPutData.WriteLine "<html>" HTMLOutPutData.WriteLine "<head>" HTMLOutPutData.WriteLine "<title></title>" HTMLOutPutData.WriteLine "</head>" HTMLOutPutData.WriteLine "<body>" HTMLOutPutData.WriteLine "<h1 align=""" &"center" &""">"& objFso.GetBaseName(file) & "</h1>" HTMLOutPutData.WriteLine "<hr>" Do Until fileRead.AtEndOfLine = true LINEDATA = fileRead.ReadLine If InStr(LINEDATA,"'") = 0 then'含んでない場合 HTMLOutPutData.WriteLine "<font color=""" &"black"&""">" & LINEDATA & "</font><br>" Else HTMLOutPutData.WriteLine Replace(LINEDATA,"'","<font color=""" &"green"&""">") & "</font><br>" End if Loop HTMLOutPutData.WriteLine "</body>" HTMLOutPutData.WriteLine "</html>" fileRead.Close Else MsgBox "ファイルが開けません" End If End if Next Msgbox "終わり!" ------------------------------------------- とりあえず、'の後全ては緑色に変更。 1行読み込み、1行ずつ改行。 元のファイル名と同じで、拡張子を.htmlにして保存。 これを目標にやっていましたが、 全ファイル思ったとおりに行くわけではなく エラーの連続です。 プログラムが悪いのでしょうか? 1個目のファイルはどんどん重くなり、 300Kくらいのサイズになります。(他のファイルは2K程度です) それを削除しようとすると、どんどんパソコンが重くなり… どこかのループが悪さしているのでしょうか?
- ベストアンサー
- Visual Basic
- WSH ドロップしたファイルのファイル名に作成日を
こんにちは WSHの質問です。 ドロップしたファイルのファイル名に作成日を追加するには どうゆう記述になりますでしょうか? Wscript.Arguments.Item を使うまではわかったのですが それ以降さっぱりわからないです。 http://www.relief.jp/docs/wsh-get-files-name-wscript-arguments.html とかが参考にしているところです。 流れ的には次のような感じでしょうか? ドロップされた 個数を数える ファイルのフルパスを取得 ファイルの作成日を取得 ファイル名を書き換える よろしくお願いいたします。
- ベストアンサー
- その他(プログラミング・開発)
- WSHで プリンタのスクリプト うまくいかない。
はじめまして、のりといいます。WSH初心者です。 以下のようなログオンスクリプトを組んで、プリンタ設定をしようとしますが、エ ラーが出ます。 <スクリプト prt.vbs> ' Shell Define Dim WshShell Set WshShell = WScript.CreateObject("WScript.Shell") ' Network Define Dim WshNetwork Set WshNetwork = WScript.CreateObject("WScript.Network") ' Setup Printer ' Dim c1Prt1 Dim c1PNam1 ' Setting Printer Class-1 ' c1Prt1= "\\C1DC01\C1MPR2" c1PNam1 = "LP-7700 No.2" WshNetwork.SetDefaultPrinter c1Prt1 <エラーメッセージ> "\\C1DC01\C1MPR2"という名前のプリンタはありません。 ただし、このプリントは存在していて、例えば「ファイル名で実行」で \\C1DC01\C1MPR2をいれるとちゃんとプリンタが出てきます。 以上のことで何かお分かりの方がいましたら、もしくは、このようなプリンタの設定 に関するURLなどご存知でしたら教えてください。 よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- 【VBScript】文字列変換&抽出
VBScriptで以下の動作を実現させたいと思っています。 ・vbsファイルにテキストファイルをドラッグする ・InputBoxに任意の文字列を入力する ・変換しますか?と問われるため、 「はい」を押したらTextStreamオブジェクトを1行ごとに読み込む ・見つかった文字列を置換し、その文字列が含まれた全ての行を 別名のテキストファイルに抽出する 例:(ファイルA) asdfghjk.vbs 1:あいうえお 2:かきくけこ 3:あいうえお ⇒ (ファイルB) asdfghjk_20151217.vbs 1:をふうえお 2:をふうえお ・「いいえ」を押したら変換しないで別名のテキストファイルに 見つかった文字列が含む行をそのまま抽出する ・見つからなかった場合、何もしない (別名のテキストファイルを作成しない) 前のプログラムだと、文字列が見つからなかった場合でも 空のテキストファイルを作成していました。 これを防ぐために、以下のように修正したのですが、 オブジェクトが存在しない旨のエラーが出て機能してくれません。 どこが問題なのでしょうか? また、次のステップとして、変換処理を加えたいのですが、 InputBoxを再び使用せずに置換することは可能なのでしょうか? 恐れ入りますが、回答いただけますと幸いです。 Option Explicit Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim objParm, strFile, strX, lonMsgBox Dim objFSO, objOpen, strText, strNewFile, objTS Dim lonDate, v, strBuffer Set objParm = Wscript.Arguments If objParm.Count = 0 Then WScript.Echo "引数が指定されていません。" WScript.Quit ElseIf objParm.Count >= 2 Then WScript.Echo "2つ以上のファイルが指定されています。" WScript.Quit Else strFile = objParm(0) End If Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.GetExtensionName(strFile) <> "txt" Then WScript.Echo objFSO.GetExtensionName(strFile) MsgBox "テキストファイル以外が指定されています。" & vbCr _ & "ファイルを指定し直してください。", vbExclamation, "Error" WScript.Quit End If strX = InputBox("抽出したい文字列を入力してください。", "変換処理") If IsEmpty(strX) Then MsgBox ("キャンセルされました。") WScript.Quit ElseIf strX = "" Then MsgBox "文字列が入力されていません。" & vbCr _ & "入力し直してください。", vbOKOnly, "Error" WScript.Quit End If lonMsgBox = MsgBox(strX & "を抽出します。" & vbCr _ & "変換しますか?", vbYesNo + vbQuestion, "確認") If lonMsgBox <> vbYes Then MsgBox ("変換をスキップします。") End If lonDate = "_" & Year(Now()) & right( "00" & Month(Now()),2) & right( "00" & Day(Now()),2) strNewFile = objFSO.BuildPath( _ objFSO.GetParentFolderName(strFile), _ objFSO.GetBaseName(strFile) & _ lonDate & "." & objFSO.GetExtensionName(strFile)) Set objOpen = objFSO.OpenTextFile(strFile, ForReading) Do Until objOpen.AtEndOfStream = True strText = objOpen.ReadLine v = strText.ReadLine If InStr(v, strX, vbTextCompare) > 0 Then strBuffer = strBuffer & v & VBCrLf End If Loop objOpen.Close Set objOpen = Nothing If IsEmpty(strBuffer) Then MsgBox strX & "が見つかりませんでした。" WScript.Quit End If Set objTS = objFSO.OpenTextFile(strNewFile, ForWriting, True) objTS.WriteLine strBuffer objTS.Close Set objTS = Nothing Set objFSO = Nothing WScript.Sleep 1000 MsgBox ("文字列の抽出が完了しました。")
- ベストアンサー
- Excel(エクセル)
- WSHでリモートスクリプト起動時エラー
□やりたいこと 2台のXP環境で、WSHを使用してリモートスクリプトを実行させたい (ローカルサーバAからリモートサーバBでJBSを実行) □事象 サーバAのVBS(rmt_local.vbs)を起動したところ、 CreateScript実行時に以下のエラーとなります。 【エラーメッセージ】 429 ActiveX コンポーネントはオブジェクトを作成できません。 □質問 原因と対応方法を知りたい。 下記の設定以外になにが影響しているのか? □環境 【ローカルサーバA】 OS:WindowsXP Professional Version 2002 SP3 WSH:Version5.8 ドメイン:WORKGROUP 【リモートサーバB】 OS:WindowsXP Professional Version 2002 SP3 WSH:Version5.8 ドメイン:WORKGROUP 【スクリプト配置】 ローカルサーバAのC:\TESTにのみスクリプト(1)と(2)を格納している リモートサーバBにはC:\TESTのフォルダのみ作成している □設定関連 ●ローカルとリモートで設定 ファイアウォール設定(DCOM、wsdcript.exeを通す) ドメインプロファイルの設定でリモート管理の例外を許可 実行ユーザをAdministratorsグループに追加 ●ローカルのみ設定 COMセキュリティのアクセス許可で「ANONYMOUS LOGIN」のリモートアクセスを許可 ●リモートのみ設定 レジストリ:HKEY\LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa の下のforceguest(文字列値)に0を設定 レジストリ:HKEY\LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settings の下にRemote(文字列値) を作成して1を設定 COMセキュリティのアクセス許可でEveryoneグループの「リモートアクセス」を許可 COMセキュリティの起動許可でAdminstratorsグループの「リモートからの起動」と 「リモートからのアクティブ化」を許可 ================================================================ □スクリプト(1) 【rmt_local.vbs】 Option Explicit On Error Resume Next Dim objWshCtrl ' WshController オブジェクト Dim strRemotePC ' リモートのコンピュータ名 Dim strScript ' 実行するスクリプトファイル Dim objExecCmd ' 実行コマンド情報 Set objWshCtrl = WScript.CreateObject("WshController") If Err.Number = 0 Then strRemotePC = "B" strScript = "rmt_remote.vbs" Set objExecCmd = objWshCtrl.CreateScript(strScript, strRemotePC) If Err.Number <> 0 Then Set objExecCmd = Nothing WScript.Echo "エラー: CreateScript " & Err.Description WScript.Echo "異常終了しました。" Else WScript.Echo strRemotePC & " で " & strScript & " を実行します。" objExecCmd.Execute Do While objExecCmd.Status = 1 WScript.Sleep(100) Loop WScript.Echo "正常終了しました。" End If Else WScript.Echo "エラー: CreateObject " & Err.Description End If Set objExecCmd = Nothing Set objWshCtrl = Nothing ================================================================ □スクリプト(2) 【rmt_remote.vbs】 Option Explicit On Error Resume Next Dim objFSO ' FileSystemObject Dim objFile ' ファイル書き込み用 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("C:\TEST\test.log", 8, True) objFile.WriteLine Now() objFile.Close Set objFile = Nothing Set objFSO = Nothing
- 締切済み
- その他(プログラミング・開発)
- 特定のワークシートcsvファイル書き出しほか
エクセルブックの中身が、 1番目 graphシート 2番目から19番目 ワークシート で構成されているエクセルファイルが100個 AAAというフォルダに入っています。 それぞれのエクセルブックにあるシートを、ブックのファイル名にしたフォルダを作成し、その中にcsvで書き出すプログラムを作りました。 また、AAAのフォルダの1つ上のフォルダ(VBA実行するカレントフォルダ)には、テキストファイルもあり、作成されたフォルダに合わせてコピーするようにしています。 一応、期待通りの動作をしましたが、スッキリとしたプログラムとするために、アドバイスをいただけないでしょうか? また、できれば、それぞれのブックの2番目から7番目のワークシートのみをcsvファイルで書き出したいと思い、シートを2番目から順にアクティブにして書き出すように変更しても1番目のグラフシートからcsvになってしまいました。 特定のワークシートのみをcsvファイルで書き出すにはどのように書いたら良いでしょうか? よろしくおねがいしむす Sub ファイル一括作成() Application.ScreenUpdating = False '対象ブックの選択 'フォルダ内のブックを順次選択 Dim FolderPath As String Dim objFSO As Object Dim objBook As Object Dim objFiles As Object Dim objFile As Object Dim mysma4 As Object Set objFSO = CreateObject("Scripting.FileSystemObject") FolderPath = ActiveWorkbook.Path & "\AAA" Set objBook = objFSO.GetFolder(FolderPath) Set objFiles = objFSO.GetFolder(FolderPath).Files Set mysma4 = objFSO.GetFile(ActiveWorkbook.Path & "\fig_all.TXT") For Each objFile In objFiles If objFSO.GetExtensionName(Path:=objFile) Like "xlsx" Then 'ベースファイル名フォルダ作成&sma4ファイルコピー objFSO.CreateFolder Path:=FolderPath & "\" & objFSO.GetBaseName(objFile) mysma4.Copy Destination:=FolderPath & "\" & objFSO.GetBaseName(objFile) & "\fig_all.TXT" '各ファイルcsv書き出し Workbooks.Open objFile.Path For Each ws In Worksheets '各シートに対して処理を繰り返す ws.Activate 'ベースファイルと同じ階層に出力 ActiveWorkbook.SaveAs _ Filename:=FolderPath & "\" & objFSO.GetBaseName(objFile) & "\" & ws.Name & ".csv", _ FileFormat:=xlCSV Next ws ActiveWorkbook.Close SaveChanges:=False Else End If Next MsgBox "ファイル作成が完了しました。" Set objFSO = Nothing Set objBook = Nothing Set objFiles = Nothing Set mysma4 = Nothing Application.ScreenUpdating = True End Sub
- ベストアンサー
- Excel(エクセル)
お礼
返信が遅くなってしまって申し訳ございません。 おっしゃる通り、System32にファイルを生成しておりました。 カレントフォルダを変更した所、無事作成することができましたのでご報告致します。 回答ありがとうございました。