Powershellでフォルダの容量を取得する

Powershellでフォルダの容量を取得する

#容量を取得するフォルダパス
$filePath = "C:\"

#スクリプトのパス
$scriptRoot = Split-Path -Path $MyInvocation.MyCommand.Path
#スクリプトのパスに移動
cd $scriptRoot

"処理開始:" + (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")

#指定パスのフォルダサイズを再帰的に取得(サブフォルダも含む)
#取得結果はスクリプトパスに出力
Get-ChildItem $filePath `
    | Sort LastWriteTime `
    | Select-Object Name, LastWriteTime, @{ name = "Size"; expression = { `
            [math]::round((Get-ChildItem $_.FullName -Recurse -Force `
                | Measure-Object Length -Sum `
            ).Sum ) `
    } } | Format-Table -AutoSize > FolderSize.txt

"処理終了:" + (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")

Powershellが実行できない

Powershellが実行できない

一生懸命作ったPowershellの実行ファイル(.ps1)をダブルクリックしてもメモ帳が開くだけだったので、実行方法をメモ

一時的に実行ポリシーを変更して実行する

powershell -NoProfile -ExecutionPolicy Unrestricted .\powershell.ps1

qiita.com

タスクスケジューラーで実行したバッチでExcelが開かない

エクセルファイルを操作するバッチをタスクスケジューラーで実行すると以下のエラーが出る。
普通に実行すると問題ないのに。。。

[COMException]ファイル 'C:\excel.xls' にアクセスできません。次のいずれかの理由が考えられます。

• ファイル名またはパスが存在しません。  
• ファイルが他のプログラムによって使用されています。  
• 保存しようとしているブックと同じ名前のブックが現在開かれています。

それらしいものを見つける

Windows7のOfficeサーバーサイドオートメーションで例外がスローされる - プログラマーな日々

どうやら、2003R2サーバーまでは存在していた「SystemProfile が実行する仮想デスクトップフォルダが存在しない」ため実行ユーザーがログオンしていない状態で実行(タスク実行とか)すると、デスクトップがないのでEXCEL(つかオフィス?)が実行できないらしい。

以下のフォルダを作成したら解決しました。

x86
C:\Windows\System32\config\systemprofile\Desktop
x64
C:\Windows\SysWOW64\config\systemprofile\Desktop

ただこの方法はマイクロソフトが推奨してないとのこと
https://support.microsoft.com/ja-jp/help/257757/considerations-for-server-side-automation-of-office

foreachでindexが知りたい

foreachで今何回目のループかが知りたい時にカウント用の一時変数を作らない方法

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 配列
            List<string> list = new List<string> { "a", "i", "u", "e", "o" };

            // 値とインデックスのペアをループ処理
            foreach (var item in list.Select((value, index) => new { value, index }))
            {
                // 今、何回目かが分かる
                Console.WriteLine("value = {0}, index = {1}", item.value, item.index);
            }
        }
    }
}

C#7だとタプルを使ってもっとスマートに記述できるらしい。

こんにちは世界

意識低い系の職業プログラマとして日々のらりくらりさせて頂いております。

 

得意なことはコピペです。

 

何度も同じことを調べる癖があるので、自分用のメモ帳・備忘録として活用します。