1

私の最終的な目標は、最終日にファイルが変更された(特定のパスの)最上位フォルダーのリストを取得することです。

これを行うには、おそらく多くの方法があります。私が問題を抱えている場所は、トップレベルのフォルダのみを取得することです。

これが私がこれまでに持っているものです:

Get-ChildItem -Path "c:\data\*" -recurse | 
where-object {$_.lastwritetime -gt (get-date).addDays(-1)} |  
where-object {-not $_.PSIsContainer} | 
Foreach-Object { $_.DirectoryName} | 
sort -unique 

ただし、トップレベルだけでなく、すべてのディレクトリを取得します。

4

3 に答える 3

2

これが私がそれをする方法です

$dirs = dir "sometoplevelpath" |?{ $_.PsIsContainer }
$oneDayAgo = (Get-Date).AddDays(-1)

$dirs |?{ dir $_ -Recurse |?{!$_.PsIsContainer -and $_.LastWriteTime -gt $oneDayAgo } | select -first 1 }
于 2012-08-21T17:56:22.837 に答える
1

最終的に作成されたフォルダのリストを取得し、名前なしでフルパスを比較して、関心のあるフォルダを含むディレクトリと一致するかどうかを確認できます。

$folders | Where-Object {$_.FullName.Replace($_.Name,"") -eq $superDirectory}

ここで、$ superdDirectoryは、「最上位ディレクトリ」を含むディレクトリの名前です。この場合、それは「C:\」のように聞こえます。

PSParentPathプロパティを調査することもできます。

別の方法は、最初に潜在的なバックアップフォルダのリストを作成することです。

$targetFolders = Get-Item -Path "C:\data*" | Where-Object {$_.PSIsContainer}

次に、そのリストを調べて、バックアップが必要なアイテムがあるかどうかを確認し、バックアップが必要な場合はアクションを実行します。

$targetFolders | % {
    $folderItems = Get-ChildItem $_.FullName | ? {.... use your filter here}
    if (($folderItems | Measure-Object).Count -gt 0){
        #Backup the folder, or add $_.FullName to the list of folders that should be backed up.
    }
}
于 2012-08-21T17:45:23.970 に答える
0

削除してみてください-recurse

Get-ChildItem -Path "c:\data*" | where-object {$_.lastwritetime -gt (get-date).addDays(-1)} | where-object {-not $_.PSIsContainer} | Foreach-Object {$_.DirectoryName} | sort -unique

また、に変更し$.ました$_.。これが機能するかどうかを確認します。トップレベルのディレクトリ名だけを教えてもらいましたが、次のようなパターンで実行できるものはありません。"c\data*"

于 2012-08-21T18:01:57.640 に答える