PowerShellでTXTを1行ごと読込んで処理

このQ&Aのポイント
  • PowerShellを使って、TXTファイルを1行ごとに読み込み処理する方法について教えてください。
  • 指定されたテキストファイルを1行ずつ読み込んで、各行に対して特定の処理を行うPowerShellスクリプトを作成したいです。
  • PowerShellでログファイルが含まれたフォルダ内のテキストファイルを1行ずつ読み込み、特定条件を満たしたファイルを別のフォルダにコピーする方法を教えてください。
回答を見る
  • ベストアンサー

PowerShellでTXTを1行ごと読込んで処理

PowerShellでの処理で教えてください。 C:\list\loglist.txtというファイルに、 C:\Documents and Settings\mama\My Documents\Shell\log C:\share\LOGS C:\diaglog というように、ログフォルダまでのパスが書いてあるファイルがあり、この中身は、時々変更されます。 このテキストを1行ずつ読み込みながら、各フォルダの配下にあるサブフォルダを含めたフォルダ内に、.logというファイルがあり、そのファイルサイズが0でなければ、ファイルを別フォルダへコピーして、元のファイルは削除するということを行いたいのです。 そこで、下記のようなスクリプトを書いてみましたが、エラーとなってしまいます。 $day = Get-Date -format yyyyMMdd $LOGPATH = "C:\list\loglist.txt" $txt = Get-Content $LOGPATH $sr = New-Object System.IO.StreamReader($txt, [System.Text.Encoding]::UTF8) while (($line = $sr.ReadLine()) -ne $null) { #0じゃないログを取得 $fname = Get-ChildItem -path $ff -Recurse | Where-Object {$_.Length -gt 0} # ログをバックアップフォルダへコピーしてリネーム     ・     ・     ・     ・ この#0じゃないログを取得にまで至らず、エラーがでます。 エラーは New-Object : "2" 個の引数を指定して ".ctor" を呼び出し中に例外が発生しました: "指定されたパスのフォーマットはサポートされていません。" 発生場所 行:×× 文字:×× + $sr = New-Object <<<< System.IO.StreamReader($txt, [System.Text.Encoding]::UTF8) + CategoryInfo : InvalidOperation: (:) [New-Object]、MethodInvocationException + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand [System.Object[]] に 'ReadLine' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。 発生場所 行:×× 文字:×× + while (($line = $sr.ReadLine <<<< ()) -ne $null) + CategoryInfo : InvalidOperation: (ReadLine:String) []、RuntimeException + FullyQualifiedErrorId : MethodNotFound パスを呼び出す元になっている『C:\list\loglist.txt』は、他の担当者が作成したものですが、パスの最後に\を入れても変わりませんでした。 PowerShellISEで、$line だけを実行すると、パスはテキストの1行目のC:\Documents and Settings\mama\My Documents\Shell\logが取得できています。 コードはhttp://codezine.jp/article/detail/3592?p=2を参考に作ってみたのですが、まだまだ初心者のためどこを修正すればいいのかわからず途方にくれています。 コードの修正か、もしくは、もっと別な方法などありましたら、ご教授をお願いします。

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

  • ベストアンサー
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.1

明示的にStreamReaderを使ってないのでなんとも言えませんが、 パッと見ループが一つ足りないような気はしました。 とりあえず、「0じゃないログを取得」まで動いた物を載せておきますね。 http://ideone.com/WnqaM

ponpokotonton
質問者

お礼

ありがとうございます。エラー発せず動きました。 エラーの原因はまだわからないのですが、教えていただいたコードを見て、未熟ゆえ、「1行ごとに読み込み、サイズも取得して・・・」だからStremReaderだろう、という発想しか浮かばず、クラスの種類や内容を良く理解していないことがそもそもの原因なんだろうと思いました。 こんなにすっきりとしたコードでできるんですね、ありがとうございました。

関連するQ&A

  • PowerShellでプロパティの"詳細"の取得

    Win10でEXCELやEXEファイルなどを右クリックしプロパティを開くと、いくつかのタブの中に「詳細」があります。その中の「コメント」情報を取得したい。AのPCとBのPCで同じPowerShellを流したら どちらも同じWin10ですが、Bのパソコンではエラーとなり取得できません。何か不足しているソフトなどあるのでしょうか? ■収集したいファイルの詳細情報のコメント(EXCEL) C:\TEMP_MS\TAN\Print\IC.XLS ■流したPowershell # シェルオブジェクトを作成 $Shell = New-Object -ComObject Shell.Application # フォルダの指定 $Folder = $Shell.NameSpace("C:\TEMP_MS\TAN\MEK\Print") # ファイルの指定 $File = $Folder.parseName("IC.XLS") # 詳細プロパティ(コメント)の取得 $GET = $Folder.GetDetailsOf($File,24) Write-Host $GET ■結果_Aのパソコン PS C:\Users\mshinoda> # シェルオブジェクトを作成 PS C:\Users\mshinoda> $Shell = New-Object -ComObject   ・途中略 PS C:\Users\mshinoda> Write-Host $GET Ver2.0.0.0      <==取得出来ました ■結果_Bのパソコン・・・エラーとなってしまいます PS C:\Users\shinoda> # シェルオブジェクトを作成 PS C:\Users\shinoda> $Shell = New-Object -ComObject Shell.Application PS C:\Users\shinoda> PS C:\Users\shinoda> # フォルダの指定 PS C:\Users\shinoda> $Folder = $Shell.NameSpace("C:\TEMP_MS\TAN\MEK\Print") PS C:\Users\shinoda> PS C:\Users\shinoda> # ファイルの指定 PS C:\Users\shinoda> $File = $Folder.parseName("IC.XLS") null 値の式ではメソッドを呼び出せません。 発生場所 行:1 文字:2 + $File = $Folder.parseName("IC.XLS") + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) []、RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull PS C:\Users\shinoda> PS C:\Users\shinoda> # 詳細プロパティ(コメント)の取得 PS C:\Users\shinoda> $GET = $Folder.GetDetailsOf($File,24) null 値の式ではメソッドを呼び出せません。 発生場所 行:1 文字:2 + $GET = $Folder.GetDetailsOf($File,24) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) []、RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull PS C:\Users\shinoda> PS C:\Users\shinoda> Write-Host $GET

  • C#のテキストファイル読み込みについて

    C#のテキストファイル読み込みについて 2次元配列を使います(a[行][列]みたいに テキストファイルを1文字ずつ読み込みます。 そして、改行文字が見つかると行を1つずらします それを繰り返して最後まで読みこむと終わり そんなことをしたいです DOBON.NETでこんなの見つけたんですが 上の処理をしようと思っても、どこをいじればできるのかわかりませんでした //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容を一行ずつ読み込む while (sr.Peek() > -1) { Console.WriteLine(sr.ReadLine()); } //閉じる sr.Close(); よくわかるサイトとかあったら教えてください、お願いします

  • PowerShellからODBC接続してSQL実行

    PowerShellからORACLEにODBC接続してSQL実行しています。 抜粋となりますが、以下の処理をしていますが、データの取得で エラーが発生し、どうしてもORACLEのDBから抽出できません。 [void][System.Reflection.Assembly]::LoadWithPartialName("System.Data") $connectionString="DSN=xxxxx;uid=xxxxx;pwd=xxxxx;" $conn = New-Object System.Data.Odbc.OdbcConnection($connectionString) $odbcCommand = New-Object System.Data.Odbc.OdbcCommand $odbcCommand.Connection = $conn $sql = "select sysdba from dual" $odbcCommand.CommandText = $sql $dataAdapter = New-Object System.Data.Odbc.OdbcDataAdapter $dataAdapter.SelectCommand = $odbcCommand $dataSet = New-Object System.Data.DataSet $nRecs = $dataAdapter.Fill($dataSet) "1" 個の引数を指定して "Fill" を呼び出し中に例外が発生しました: "算術演算の結果オーバーフローが発生しました。" 発生場所 行:1 文字:27 + $nRecs = $dataAdapter.Fill <<<< ($dataSet) + CategoryInfo : NotSpecified: (:) []、MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException DataSetに格納でエラーとなったので、ExecuteReaderに変えて実行。 上記、処理に $conn.Open() を追加し、 $odbcReader = $odbcCommand.ExecuteReader() "0" 個の引数を指定して "ExecuteReader" を呼び出し中に例外が発生しました: "算術演算の結果オーバーフローが発生しました。" 発生場所 行:1 文字:41 + $odbcReader = $odbcCommand.ExecuteReader <<<< () + CategoryInfo : NotSpecified: (:) []、MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException と、DataSetを使おうが、ExecuteReaderを使おうが同じエラーが発生した。 何が原因で発生しているのでしょうか。 また、対処はどのようにしたらよいのでしょうか。 お願いします。 環境 ・Windows7 64ビット ・64ビット oracle client 11gR2 ・sqlnet.ora、tnsnames.ora を作成 ・odbcデータソース作成  TNSサービス名には、tnsnames.ora にあるサービス名を指定

  • VB2008

    VB初心者です、よろしくお願いいたします。 現在、VB2008を使い、顧客名簿を作成しています。 前回の質問で、テキストファイルのファイル名だけを取得する方法は分かったのですが、そのファイルの内容をテキストボックスに表示する方法がうまくいきません。 ファイルの内容は 1行目→名前 2行目→メールアドレス 3行目→郵便番号 4行目→住所 5行目→購入した商品 をそれぞれ、textbox1~5に表示させたいと思っています。 書籍などで調べた結果 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim totalcount As Integer Dim oneline As String Dim sr As System.IO.StreamReader sr = New System.IO.StreamReader("C:hogehoge\" & ComboBox1.Text & ".txt") oneline = sr.ReadLine() sr.Close() Dim skipline As Integer Dim r As Random = New Random() skipline = r.Next(totalcount) sr = New System.IO.StreamReader("C:hogehoge\" & ComboBox1.Text & ".txt") Dim i As Integer = 0 Do While i < skipline sr.ReadLine() i += 1 Loop oneline = sr.ReadLine() sr.Close() TextBox1.Text = oneline TextBox2.Text = (skipline + 1).ToString() End Sub このような記述になりました。 textbox1には問題なく名前が表示されますが、textbox2には"1"と表示されてしまいます。 すみませんが、修正箇所を教えていただけませんか? よろしくお願いいたします。

  • ファイルを処理中に次の処理に移ってしまうようなのですが、、

    VB.NETですが、 趣味でアプリケーションを作成しています。 下記のコードで処理を実行させています。 Call Shell("C:\aaa.exe c:\test.txt c:\test2.txt", AppWinStyle.Hide) (A) Dim sr As New System.IO.StreamReader("c:\test2.txt", System.Text.Encoding.Default) Dim sb As New System.Text.StringBuilder(CInt(Microsoft.VisualBasic.FileSystem.FileLen("c:\test2.txt") * 1.1)) 'ファイルの最後までループ Do Until sr.Peek = -1 sb.Append(sr.ReadLine & vbCrLf) Loop sr.Close() "aaa"はtest.txtを加工してtest2.txtとして出力するプログラムです。 その後、test2を最後まで読み出しているのですが、 どうもプログラムaaaが処理を終了する前に 次の読み出し処理に移ってしまっているようなのです。 そこで、素人なりに上記(A)の部分に For i = 0 To 2000000000 Next For i = 0 To 2000000000 Next とForループを加えて時間稼ぎしているのですが、 状況によって時間稼ぎがうまくいかない場合があります。どのように問題を回避すべきでしょうか? aaaはDLLでも組み込み可能になっているプログラム なのですがDLLで実行させると何らかのメリット があるのでしょうか? その点を教えていただけると助かります。 回答よろしくお願いいたします。

  • powershell)ファイル内変数名を変換したい

    powershellです。 変数に例えば以下の変数が設定されているとします。 ${VAL1}="aaa" ${VAL2}="bbb" test.txtというファイルに以下が記載されているとします。 ${VAL1} ${VAL2} test.txtというファイルを読み込んだ際に、 ${VAL1}を"aaa"、${VAL2}を"bbb"と読み替えて読み込む方法はありますか。 変数のパターンは事前に分からないので、 '${VAL1}'を"aaa"に置換する、とかの方法はなしです。 Invoke-Expressionを使えばうまくいくかと思い、 以下のように書いてみましたが、 Invoke-Expressionのコメントをはずすとエラーになります。 --------- ${VAL1}="aaa" ${VAL2}="bbb" ${SR} = New-Object System.IO.StreamReader( "Y:\test.txt", [Text.Encoding]::GetEncoding("Shift_Jis")) while ((${LINE} = ${SR}.ReadLine()) -ne ${null}){ #Invoke-Expression "${LINE_VAL}=${LINE}" Write-Output ${LINE} #Write-Output ${LINE_VAL} } ${SR}.close --------- 何か分かる方教えてください。

  • 複数のtxtファイルをエクセルに貼りつける方法 2

    前回質問した者です。 http://okwave.jp/qa/q7062908.html ある特定のフォルダ内に複数のフォルダがあり、その中の各フォルダには、txtファイルが複数あります。 VBAを使ってエクセルのA列にフォルダ名、B列にtxtファイル名、C列にはtxtファイルの内容を入れたいです。(今はコピペを手動で行っています) フォルダA ↓ フォルダ1、フォルダ2、フォルダ3、・・・・ ↓ 各フォルダにはtxtファイル(改行あり) VBAは解らないのですが、自分なりに検索してみて、以下のコードを見つけました。 しかし、以下の場合はA列にtxtファイルの内容しか入らず、また、特定のフォルダのみしか反映されません。 そこで、フォルダAのパスだけを指定して、A列にフォルダ名、B列にtxtファイル名、C列にはtxtファイルの内容を入れるにはどうすればいいのでしょうか? Sub Macro() Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim FolderPath As String 'ここのアドレスをファイルが格納されているフォルダのパスに変えてください FolderPath = "H:\Documents and Settings\asano\デスクトップ\TEST" Dim myFile As Object Dim i As Long i = 1 For Each myFile In fso.GetFolder(FolderPath).Files Cells(i, 1).Value = fso.OpenTextFile(myFile.Path).ReadAll() i = i + 1 Next End Sub

  • ローカルのtest.txtを1行ずつ読み込みたい

    javascriptでローカルのtest.txtを1行ずつ読み込みたいため、ネットでtxtファイルの読み込みのコードを 探したら、自分のやりたいのに一番近いなと思う http://www.happy2-island.com/vbs/cafe02/capter00 … が見つかりました。 しかし、貼り付けて実行しても何も表示されません。 objParm(0)を"test.txt" objFileSys.BuildPath(strScriptPath,strFileName)を "file:///C:/Users/aaa/Documents/javascript"に WScript.echoをdocument.write とかに書き換えてみても、test.txtの中身が表示されません。 他にも検索するのですが、ネット上のtxtファイルの読み込み方とか いまいちなコードしか検索ででてこず困っています。 test.htmlと同じローカルのディレクトリにあるtest.txtを読み込みたいのです どのように書けばいいのでしょうか。 アドバイスいただけるとうれしいです。

  • 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 どなたかご教授下さい。

  • PowerShellでのSQLiteパスワード接続

    PowerShellでSystem.Data.SQLite.dll使いSQLiteのdbに接続したいと思ってます。dbにはPupSQLite.exe で暗号パスワードをかけてます。実行するとエラーになります(パスワード解除したdbだと正常に接続できます)たぶん;Password='psw'の記述方法が違うと思うのですが、Passwordはどのように記述すればよろしいのでしょうか? サイトも確認しましたがわりません、それともSystem.Data.SQLite.dllがダメなのでしょうか? sqlite-netFx46-static-binary-Win32-2015-1.0.115.5のSystem.Data.SQLite.dllになります Add-Type -Path 'C:\temp\pSQL\System.Data.SQLite.dll' [string]$mySQLConnectionString = "Data Source = 'C:\temp\pSQL\sample.db';Password='psw'" $connection = New-Object -TypeName System.Data.SQLite.SQLiteConnection $connection.ConnectionString = $mySQLConnectionString try { $connection.Open() } catch { $connection.Close() } $command = $connection.CreateCommand() $command.CommandText = 'SELECT * FROM ListA' try { $result = $command.ExecuteReader() } catch { $connection.Close() } $dataTable = New-Object "System.Data.Datatable" $dataTable.Load($result) $dataTable | Format-Table $connection.Close() "1" 個の引数を指定して "Load" を呼び出し中に例外が発生しました: "値を Null にすることはできません。 パラメーター名:dataReader" 発生場所 行:28 文字:1 + $dataTable.Load($result) + ~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ArgumentNullException

専門家に質問してみよう