PowerShellでファイル存在確認する方法とは?

このQ&Aのポイント
  • PowerShellでファイル存在確認する方法を学んでいます。
  • 日付を取得してファイル名に使用し、ログファイルを作成する際に既存のフォルダが存在する場合にエラーが発生します。
  • ファイルの存在確認とフォルダの作成を分岐させるために、日付を取得してファイル名を設定する方法を教えてください。
回答を見る
  • ベストアンサー

PowerShellでファイル存在確認するとき

PowerShellについて勉強中です。 現在、日付を取得したものをファイル名にしてログファイルを作成し、そこに、その日の実行したスクリプトの結果が追記されていくようにしたいのですが、新規にファイルを作成した時には、当然問題がないのですが、new-itemを使用したため、すでにフォルダがありますとエラーになってしまいます。 ログファイルを作成する部分と、スクリプト実行の部分を分けずに、ひとつのps1にしなければなりません。 そのため、if文などで分岐をする必要があると思うのですが、ログのファイル名が日付を取得するので、このような場合、どう記述するものなのか、教えていただければと思います。 日付を取得してファイルを作成したところまでを、下に書きます。 よろしくお願いします。 Function GetFileName([ref]$fileName) #日付を取得してログファイル名に設定する { $invalidChars = [io.path]::GetInvalidFileNamechars() $date = Get-Date -format yyyy/MM/dd $fileName.value = ($date.ToString() -replace "[$invalidChars]","-") + ".log" } $fileName = $null #ログファイルをc:\shareに作成する GetFileName([ref]$fileName) new-item -path c:\share -name $filename -itemtype file この下に、実行するバッチの起動などのスクリプトが続きます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

System.IO.StreamWriter(String, Boolean, Encoding)コンストラクタの第二引数や http://msdn.microsoft.com/en-us/library/f5f5x7kt.aspx FileStream(String, FileMode, FileAccess)コンストラクタ第三引数でなんとかすれば別に分岐は必要ない #最初の$filename取得がやたら回りくどいのは俺の好みの所為。 #System.IO.File.AppendAllText(String, String, Encoding)があまり好きではない。個人的に。 $filename = [System.IO.Path]::Combine("C:\",[System.IO.Path]::ChangeExtension([System.DateTime]::Now.ToString("yyyy-MM-dd",[System.Globalization.CultureInfo]::InvariantCulture),"log")); $str = New-Object -TypeName ("System.IO.StreamWriter") -ArgumentList ($filename,$true,[System.Text.Encoding]::UTF8) $str.WriteLine("xxxx") $str.Flush() $str.Close() ============ どうしても分岐したければ if([System.IO.File]::Exists("C:\books1.csv")){ [System.Console]::WriteLine("abc") }else{ [System.Console]::WriteLine("def") } とかやればいいけれども。

ponpokotonton
質問者

お礼

回答ありがとうございます。 $filename = [System.IO.Path]::Combine("C:\",[System.IO.Path]::ChangeExtension([System.DateTime]::Now.ToString("yyyy-MM-dd",[System.Globalization.CultureInfo]::InvariantCulture),"log" この部分が、回りくどいとおっしゃっていましたが、私にはとてもわかりやすったです。 ただ、同じように初心者の人が、修正したりする作業が発生した場合に見てわかりやすいのが分岐かな?と思ったのです。 分岐の例にあるファイル名のところがExists("C:\books1.csv")のように()内にファイルのPATHを記述すればいいのだと思うのですが、ファイル名が取得した値を利用するため変わる場合は、どう記述したらよいのかがわかりませんでした。

ponpokotonton
質問者

補足

早速の追記ありがとうございました。 確かに、力を引き上げるのが一番なんですよね(自分を含め)。 今回いただいた二つのものから、System.IOの使い方が良くわかっていない自分に気がつきました。 分岐をするにしてもしないにしても、ここがちゃんとわかってないと、つまずきから前に進めないこともよく自覚できました。 (あと、英語のサイトを避けて通らないこと) ありがとうございます。

関連するQ&A

  • ファイル名が日付のファイルの存在を確認する方法

    OK Waveにお世話になっております。 VB6でソフト製作している初心者ですが、ファイル名が日付の場合に、 そのファイルの存在を確認する方法がわかりません。 対象物に設定完了後にログ作成で、ファイル名を日付でTxtファイルを作成して2行書き込むのですが、再度違う対象物に設定完了時は同じファイル名が存在するなら(同じ日付なら)1行だけ書き込みたいのです。 (1日に10回くらい設定する予定ですので、全て一つのファイルにログを残したい。。。) <やりたいこと> 1.設定完了 ↓ 2.ログ作成作業開始 ↓ 3."C:\Log\"がなければフォルダを作成する ↓ 4.同じファイル名がなければ2行書き込んで保存 ↓ 5.同じファイル名があれば1行だけ書き込んで保存 ↓ 6.以後繰り返し。 4~5がどうしても出来ません。 ファイル名が日付で流動的なので、存在の確認の方法がわかりません。 下記に現在の4~5のコードを書きます。 毎回毎回2行書き込んでしまいます・・・。 ----------------------------------------------------------------------------------- Dim fileNo As Integer Dim FileName As String Dim IDNumber As String If Dir("C:\Log\", vbDirectory) = "" Then 'C:\Logフォルダがあるか確認 MkDir ("C:\Log\") 'なければフォルダ作成する End If 'ファイル番号の取得 fileNo = FreeFile 'ファイルを追加モードで開く (ファイル名の生成) Open "C:\Log\" + Format(Date, "yyyy年mm月dd日") + ".txt" For Append As #fileNo 'txtファイルへ書き込む Print #fileNo, "設定日時,対象番号,設定値" Print #fileNo, Format(Now, "hh:mm:ss") + "," + Format(IDNumber) + "," + Format(check, "000000") Close #fileNo 'ファイルを閉じる ----------------------------------------------------------------------------------- ちなみに下記のようにやってみましたがDate.txtの存在を認識してくれません。。。 If Dir(Date.txt) = "" Then Print #fileNo, "設定日時,対象番号,設定値" Print #fileNo, Format(Now, "hh:mm:ss") + "," + Format(IDNumber) + "," + Format(check, "000000") Close #fileNo Else Print #fileNo, Format(Now, "hh:mm:ss") + "," + Format(IDNumber) + "," + Format(check, "000000") Close #fileNo End If あとここだけなんです。 6/13(月)納期なので、どなたかわかる方、助けてください! よろしくお願いいたします!

  • [PowerShell]ファイルの権限を確認したい

    powershellで、スクリプトの実行ユーザが 特定のファイルやフォルダに読み込み権限や書き込み権限が あるかどうかを確認するにはどうすればよいのでしょうか。 Get-Aclだと、ファイルやフォルダの権限一覧が取得できるだけなので、 そのオブジェクトから実行ユーザの権限を確認する必要があるのでしょうか。 どのように確認するのか分からないので教えてください。

  • 現在時刻を取得してファイル名にする

    いつもお世話になっています。 コマンドプロンプトから処理を実行し、その結果をログファイルとして残すバッチファイルを作成しています。 ログファイルを日付で管理したいので、ファイル名を "バッチファイル名_yyyymmdd.LOG"としたいのですが この"yyyymmdd"の部分で詰まってしまいました。 set NowDate=%date% set FileName=C:\temp\sample_%NowDate% としてみましたが、NowDateが"月 2003/07/28"となり、"/"のために ファイルが作成されませんでした。 %time%も":"が入ってしまうため、同様に作成されません。 バッチファイル内でyyyymmddを毎回記述し直せば楽なのでしょうが、 最終的にはタスクスケジュールに入れてしまいたいのでそれもできません。 どうしたら現在日をファイル名にすることができるのでしょうか? 御存知の方、教えてください。

  • PowerShellのスクリプト実行について

    PowerShellのスクリプト実行について PowerShellの勉強をしていますが、スクリプトを実行できません。。。 なんか、スクリプトの環境変数を設定するようですが、どこにも 設定方法がないです。。。。 もちろん、Set-ExecutionPolicy Unrestrictedは実行してあります。 以下日付と時間を表示するだけのスクリプトです。 ---------test.ps1--------- get-date get-time ---------------------------- スクリプトファイルの置き場所 ⇒ C:\script-test\test.ps1 ちなみに、スクリプトファイルを置いたディレクトリに移動して 実行しても、以下のようなメッセージが出て実行できませんでした。。 用語 'C:\script-test' は、コマンドレット、関数、スクリプト ファイル、または操作 可能なプログラムの名前として認識されません。名前が正しく記述されていることを確 認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してく ださい。 発生場所 行:1 文字:15 + C:\script-test <<<< .\test.ps1 + CategoryInfo : ObjectNotFound: (C:\script-test:String) []、Comma ndNotFoundException + FullyQualifiedErrorId : CommandNotFoundException どなたかご教授下さい。

  • phpのディレクトリーorファイルのパーミッション

    お世話になります。 どうやってもうまくいかないので、質問させていただきます。 phpでログファイルを書き込むようにしたいのですが、 ファイルが作成されません。 根本的なところができていないのだと思いますが、教えてください。 やりたいことは、指定のパス(docomwnt_root配下の/logまたは include/log) にyyyymmdd.logで、テキストを書き込みたいのです。 いろいろ調べて、ディレクトリの場合は 0777、ファイルは0666にchmodすればよいとのことで 変更したのに、ファイルがないといわれてしまいます。 ソースコードは以下になります。 すみません、試行錯誤の名残とdebug行が入っています。 <?php //function logout($content){ $content="test"; error_log($content,0); //ログファイル設定 // $logpath = '/log'; // if( !is_dir($logpath) ){ // die("ディレクトリが存在しません -->". $logpath); // } //日時取得 $dateobj = new DateTime(); //アクセスタイム取得 $accessTime=$dateobj->format('Y-m-d H:i:s'); //書き込む内容 $log = $accessTime . " " . $content . "\n"; // ファイル名 $date = $dateobj->format('Ymd'); // $filename = realpath( $logpath ) . '/'.$date . '.log'; // $filename = dirname(__FILE__) . '/log/'. $date . '.log'; $filename = $date . '.log'; echo $filename; $directory_path = "./log"; if( mkdir( $directory_path, 0777) ){ echo "ok<br>"; chmod( $directory_path, 0777); } else{ echo "ng<ng>"; } if( !$fp = fopen($filename, 'ab') ){ echo "cannot open file($filename)<br>"; return -1; } if( !$fp = flock($fp, FILE_APPEND | LOCK_EX) ){ echo "cannot open file($filename)"; return -1; } if( fwrite($fp, $content) === FALSE){ echo "cannot write file($filename)<br>"; return -1; } if( !fclose($fp) ){ echo "cannot close file($filename)"; return -1; } // return 0; //} ?> この場合だと cannot open file になってしまいます。 windowsばかりやってきていたのでlinuxは、、、わかりません。 いろいろ、サンプルを試しているのですが、うまくいかなくて。。。 すみません、ご指導よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Linuxのバックアップシェルについて教えて下さい

    Linuxで、簡単なバックアップのシェルを作成する必要があり、今勉強を始めました。 これから確り勉強しますので、参考としてやりたいことのスクリプト例を教えて頂けませんでしょうか。 やりたいことは、Linuxサーバー内のフォルダAをファイルサーバー上のフォルダBへ日次でコピーです。 この時、フォルダAまでのパスには、日付名が入っており毎日変わります。シェル実行日の1日前のデータをコピーしたい場合、まずパスの作り方がわかりません。 PATH=/usr/local/sbin:/usr/bin:/bin #昨日の日付の取得 YESTERDAY= DATE +%Y%m%d #バックアップ対象のパス取得 BACKUP-PATH= 1G/昨日の日付/log/ ↑              ここがわかりません。$YESTERDAYと入れてみましたがダメでした。 #バックアップ先のパス取得 TARGET= \\filseerver/1G/日付/log ↑      こんな感じで外部の保存先のパスはかけるのでしょうか? バックアップ処理 ○○日前のデータは削除 全体ではこんな感じになると思うのですが、具体的なスクリプトの説明をお願いできますでしょうか。 またよい参考サイトがあれば是非教えて下さい。 宜しくお願い致します。

  • バッチファイルにてFTPで指定したファイルを取得する

    OSはWindoswXPProです。 以下のようなBATファイルとバッチファイルを作成しました。 ---FTP.bat--- echo off ftp -s:get.ftp ---get.ftp--- open 10.0.X.X username password cd /log get log.yymmdd(実際には日付) c:\access_all_log.txt quit logというディレクトリには日次でログファイルが作成され ファイル名としてlog.yymmddと名づけられています。 やりたいことは2つあります。 1つめはftpするファイル名の日付部分をコマンドなどから 範囲指定して取得するファイルを指定できないか。 (たとえば070301~070315のファイルを一括で取得したい) 2つ目はftpでのファイル取得終了後に続いて バッチスクリプトを流したいのですが、その方法。 お分かりになる方いらっしゃいましたらよろしくお願いいたします。

  • Powershellで外部テキストファイルより

    まだまだPowershellの初心者で勉強中です。よろしくお願いします。 下記のような記述がしてある『applist.txt』というテキストファイルがあります。 ホスト名  チーム名 abc123  ponpon666 12def456  gekogeko777 ghi78912  fufufu888 Powershellで、まず端末のホスト名を取得し、その値と、上記の『C:\share』というフォルダの中にあるテキストのホスト名と一致した行にある値を表示したいのです。 外部テキストは、他の作業でも使用するため編集はできません。 作ってみたものは、   $result = ipconfig /all $hostname = $result[6].split(":")[1].Trim()  Select-String $hostname -Path C:\share\applist.txt  として、  ホスト名がghi78912という名前のPCのPowershell ISEで実行したところ  C:\share\applist.txt:3:ghi78912 fufufu888 と1行分が出てしまいます。 これをチーム名のfufufu888だけが取得できるようにするには、どのようにすると良いのか、教えていただけませんでしょうか。

  • 簡単なPowerShell

    Windows10のPowerShellで、ディレクトリを作りたいのですが、本日の日付の翌日の日付をyyyymmdd の形式で表した名前のフォルダを作りたいです。 例えば、本日が2022年5月25日であれば、c:\xxx\に、20220526 というフォルダを自動生成したいです。 最終的には、Windowsキー+R キーでファイル名を指定して実行から これが起動できればOKなのですが、何かスクリプトのようなものを作らなければなりませんか?(PowerShellド素人です) (Get-Date).AddDays(+1).ToString("yyyyMMdd") で翌日のyyyymmddを 取り出せることはわかったのですが、それを使って c:\xxxにフォルダはどう作るのかすらわかっていません。 mkdir c:\xxx\(Get-Date).AddDays(+1).ToString("yyyyMMdd") はやっても無駄でした。文法がわからず困ってます。

  • ファイルのコピー

    毎日、3つのファイル (この質問では1つとします) をコピーするのですが、簡単にしたいと思っています。 1. c:\log\log.2008-07-25 という名前のファイル (日付は昨日の日付) 2. c:\20080725\log というフォルダ (日付は昨日の日付) 1のファイルを2のフォルダ内にコピーしたいです。 ファイル名やフォルダ名の日付部分は、昨日の日付なので、毎日変化します。 調べたところ、メモ帳で以下のように書いて、copy.cmdなどという名前で保存すればいいというところまでは分かりましたが、日付の変化に対応できません。 copy c:\log\log.2008-07-25 c:\20080725\log これに加え、毎日、同じ時間にこのスクリプトを自動実行できればさらにいいと思っています。可能でしょうか。 宜しくお願い致します。

専門家に質問してみよう