重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

この下に、実行するバッチの起動などのスクリプトが続きます。

A 回答 (1件)

System.IO.StreamWriter(String, Boolean, Encoding)コンストラクタの第二引数や


http://msdn.microsoft.com/en-us/library/f5f5x7kt …
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")
}
とかやればいいけれども。
「PowerShellでファイル存在確認す」の回答画像1

この回答への補足

早速の追記ありがとうございました。

確かに、力を引き上げるのが一番なんですよね(自分を含め)。

今回いただいた二つのものから、System.IOの使い方が良くわかっていない自分に気がつきました。
分岐をするにしてもしないにしても、ここがちゃんとわかってないと、つまずきから前に進めないこともよく自覚できました。
(あと、英語のサイトを避けて通らないこと)

ありがとうございます。

補足日時:2011/07/14 09:37
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
$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を記述すればいいのだと思うのですが、ファイル名が取得した値を利用するため変わる場合は、どう記述したらよいのかがわかりませんでした。

お礼日時:2011/07/13 21:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!