2018年7月2日シェアツイートシェアブックマーク前回、Windowsのコマンドプロンプト上でJScript(マイクロソフト版JavaScript)を実行するWSHの基本的な流れを試してみました。今回は、ローカルのファイルシステムにアクセスするFileSystemObjectを使ってファイルパスの処理とファイル操作を行ってみることにします。No.1のCodeCampが運営するプログラミング未経験の方のための学習メディアですCodeCampとは?(受講生体験記)「エンジニアは女性のキャリアとして魅力的」未経験からの転職体験記リモートワーク×多拠点居住の新しい生き方を実現する。目次WSHでWindowsのオブジェクトを使うファイルパスの処理ファイルとディレクトリの存在確認ファイル操作(コピー・削除)WSHでWindowsのオブジェクトを使うWSHでは、COM(ActiveX)などWindowsが持っている様々なオブジェクトを利用することができます。COMは、Windows上で再利用可能なオブジェクト(他のプログラムから利用できる機能をまとめたコンポーネント)を実現する仕組みです。COMオブジェクトとして作成されているオブジェクトは、各種プログラムやWSHなどから呼び出して利用することができます。Windowsには多様な機能を実現するCOMが標準搭載されているほか、自分で独自のCOMを作成してインストールすることもできるため、WSHを使うとWSHの入出力やJavaScriptの処理能力とCOMの独自機能を組み合わせて「Windowsのシステムにアクセスするスクリプト」を作成することができるわけですね。中でも、FileSystemObject(Scripting.FileSystemObject)は、ファイルシステムにアクセスする機能を提供するオブジェクトなので使用する機会も多くなるでしょう。今回は、FileSystemObjectを通してWindowsのファイルシステムを扱うWSHを試してみたいと思います。FileSystemObjectを使用するには、まずActiveXObjectコンストラクタでオブジェクトの参照を取得します。ActiveXObject("Scripting.FileSystemObject");としてFileSystemObjectを作成すると、以降オブジェクトの参照を格納した変数fsoを通してFileSystemObjectの関数やプロパティにアクセスできるようになります。ファイルパスの処理まず、FileSystemObjectでファイルパスに関する情報を取得してみましょう。FileSystemObjectには、パスの文字列からファイル名やディレクトリを分離したり逆に部分的なファイル名や相対パスから絶対パスを取得する機能があります。cscriptで起動されたWSH環境では、WScript.ScriptFullNameにスクリプトのパスが格納されていますので、手始めにこのパスを「分解」してみましょうか。FileSystemObjectには、渡されたファイルパスのディレクトリ/ファイル名全体/拡張子なしのファイル名/拡張子を得る関数があります。これらを順次呼び出して表示してみましょう。以下のファイルをtest.jsなど適当な名前で作成しcscriptで実行してみてください。script_ext);実行すると、jsファイルの絶対パスに続いてディレクトリ/ファイル名/ファイル名の名前部分/拡張子が順次表示されました。GetParentFolderName()は、渡されたパスの親ディレクトリを得る関数なので、ファイルのパスを渡すと「ファイルが存在するディレクトリ」を取得することができます。GetFileName()は、ファイル名全体、GetBaseName()はファイル名の拡張子を除いた名前部分、GetExtensionName()は拡張子を取得する関数です。これらの関数は実際にファイルがあるかに関係なくパスの文字列として処理するだけなので、ファイルやディレクトリとして実在しないパスを渡すことも可能です。架空のパスを渡す形でWScript.Echo(fso.GetParentFolderName("x:\\aaa\\bbb\\c.txt"));とすると、ディレクトリ部分の「x:\aaa\bbb」が返されます。ドライブやディレクトリを含む絶対パスからディレクトリパスやファイル名の構成要素を取得できたので、次は相対パスから絶対パスを生成してみましょう。FileSystemObjectのGetAbsolutePathName()にパスを渡すと、相対パスから絶対パスを作成することができます。現在のカレントディレクトリがd:\testならfso.GetAbsolutePathName("test.txt");とすることでd:\test\test.txtという文字列が得られるわけです。相対パスには実在しないファイルを指定することもできるので、現在のディレクトリに新規作成したいファイルの名前をGetAbsolutePathName()に渡して絶対パスを作成し、それを(絶対パスを必要とする)他のプログラムに渡す、といったこともできます。したパスの生成にはBuildPath()を使うこともできます。BuildPath()は、親ディレクトリとファイル・ディレクトリ名を指定するとファイル・ディレクトリの絶対パスを返す関数で、末尾の\なども自動で処理されます。"ccc.txt")この2つは、いずれも同じ文字列(d:\aaa\bbb\ccc.txt)を返すわけです。ディレクトリ文字列の\が混在する場合には、BuildPath()を使うことで\の有無などで振り分ける手間を省くことができます。以上、WSH(JScript)でパスの文字列を処理する方法をいくつか見てきました。絶対パスからディレクトリを特定しそのディレクトリに対して何らかの処理を行う、拡張子を判別して処理を振り分ける、ファイル名の拡張子を変更して処理結果のファイルを作成する......パス周りの処理が必要になる場面はかなり多いと思うので、JScriptからパスの文字列を処理する流れをしっかりつかんでおきたいところですね。これまで使用してきたパス関数では、存在しないファイルのパスでも扱うことができました。実際にWSHを使用する場面では、「ファイルの存在確認」を行う機会も多くなるかもしれません。続いて、ファイルやディレクトリの存在確認を試してみましょう。FileSystemObjectには、ファイルの存在確認を行うFileExists()とディレクトリの存在確認を行うFolderExists()があるので、これらを使ってみましょう。コマンドプロンプトで適当なディレクトリに移動(cd)したら、test.txtなど適当なファイルを新規作成し配置してください。続いて以下のjsファイルを作成し、cscriptで実行してみましょう。この例では、FileExists()の引数に相対パスで指定しているため、「現在のディレクトリ内にtest.txtがあるか」判定することになります。exists」と表示されたはずです。続いて、test.txtを削除して実行してみてください。exists」と表示されたと思います。ファイルの存在確認ができたら、FileExists()をFolderExists()に置き換え、適当なディレクトリ名でディレクトリの存在確認も試してみてください。testというディレクトリを作成してFileExists()の引数にtestという文字列を渡してみましょう。作成したtestディレクトリ内にtest.txtを新規作成してFileExists("test\test.txt")を実行するとどうなるかも、試してみましょう。CodeCamp提供のWebマスターコース当メディアを運営しているCodeCampではWebマスターコースを現役エンジニアのマンツーマンレッスンという形で提供しています。実際にWebサービスをを開発するのでポートフォリオとしても使用できる無料レッスン受講後の申し込みで10,000円クーポンをプレゼントしています!ぜひお試しください。\Webサイト担当者としてのスキルが身に付く/CodeCampの無料体験はこちら▶︎無料体験レッスンの申し込みはスマフォで1分で完了!ファイル操作(コピー・削除)最後に、コピーや削除などディレクトリやファイルの操作を試してみたいと思います。実際にファイル操作を行うことになるので、以下の例は新しく実験用のディレクトリを作成して、そのディレクトリ内でWSHスクリプトを実行するようにしてください。ファイルやディレクトリのコピーはFileSystemObjectのCopyFile()/CopyFolder()で行うことができます。いずれも、引数にコピー元、コピー先を順に指定し、上書を禁止したいときは3つめの引数としてfalseを指定します。実験用に適当なディレクトリを作成したら、そのディレクトリに移動して1.txtの名で何か文字列を入れたテキストファイルを作成してください。その状態で以下のjsファイルを作成して実行してみましょう。"2.txt");dirコマンドでファイルを見てみると、2.txtが作成されているのが確認できると思います。ファイルができているのを確認したら、エクスプローラーでディレクトリを開いて2.txtをテキストエディタで見て内容もコピーされていることを確認してください。この状態で1.txtを変更して再度先ほどのjsファイルを実行するとどうなるか、見てみましょうか。1.txtをテキストエディタで開いて文字列を変更し、再度jsファイルを実行してみると......2.txtの内容も1.txtの内容になっていますね。「上書コピー」されたわけです。次に、3番目の引数に「false」を指定して試してみましょう。false);に変更してから実行すると......今度は、「既に同名のファイルが存在しています」というエラーメッセージが出て、コピーが行われませんでした。上書き禁止になっているようです。ファイルに続いてディレクトリをコピーしてみましょう。実験ディレクトリ内にaなどの名でディレクトリを作成し、1.txtをコピーしてください。その状態で以下のjsファイルを実行してみましょう。"b");実行後にディレクトリ内を見てみると、bが作成されbの中には1.txtがコピーされていることが確認できると思います。ファイル・ディレクトリの削除は、FileSystemObjectのDeleteFile()/DeleteFolder()で行うことができます。これまでの例でいくつかファイルを作成・コピーしてきましたが、まずは適当なファイルのファイル名をDeleteFile()に渡して削除してみましょう。削除できたことを確認したら、別のファイルに「読み取り専用」の設定を行って削除してみてください。今度は、「書き込みできません」というエラーが出て削除できないと思います。読み取り専用のファイルを削除するには、DeleteFile()の第二引数にtrueを設定します。実際にtrueを追加して試してみましょう。以上、FileSystemObjectによるファイル操作をざっと見てみました。JavaScriptにはかなり充実した文字列処理能力があるので、うまく活用すれば複雑な条件でパスを生成しファイル処理を行うようなシステムも手軽に実現できるようになるでしょう。家事も仕事もプログラミングも。2020年版】社会人でも通いやすいプログラミング教室5選|選び方の基準も解説プログラミング学習プログラミングスクール・サービス「エンジニアは女性のキャリアとして魅力的」モノづくり好き理系女子がWebエンジニアへ転職するまで受講生インタビュープログラミング未経験で介護師からエンジニアへ。家事も仕事もプログラミングも。受講生インタビュープログラミング習得後、フリーランスに転身。受講生インタビューフリーランス塾講師からエンジニアへ26才で転職。先生の支えがあって成長できました。学習ガイドtwitterLINE。