4

バックグラウンド

1 日を通して MSI ファイルが自動的に入力されるディレクトリがあります。タスク スケジューラを利用して、以下に示すスクリプトを 15 分ごとに実行する予定です。スクリプトはディレクトリを検索し、過去 15 分間に作成された新しい MSI をネットワーク共有にコピーします。

このフォルダ内C:\ProgramData\flx\Output\<APP-NAME>\_<TIME_STAMP>\<APP-NAME>\には、他に と の 2 つのフォルダがありRepackagedますMSI Package。このRepackagedフォルダーには MSI が含まれていないため、フォルダーを検索する必要はありません。また、このエラーを防ぐために何らかの方法で除外する必要があることもわかりました。

Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
At line:14 char:32
+$listofFiles=(Get-ChildItem <<<< -Recurse -Path $outputPath -Include "*.msi" -Exclude "*.Context.msi" | where {$_.LastAccessTime -gt $time.AddMinutes($minutes)})
+ CategoryInfo : ReadError: C:\ProgramData\...xcellence\Leg 1:String) [Get-ChildItem], PathTooLongException
+ FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand

制限事項

  • Powershell v1.0 の使用に行き詰まっています
  • ソースの場所のディレクトリ構造を制御できません

更新しました:

  • アプリ名やタイムスタンプがわかりません。それは私の手に負えない別のものです。

現在の計画

using について読んだこと-Filterがあり、関数に似たフィルターを認識していますが、それらの使用方法についてのアイデアを思いつくことができませんでした。現時点での私の唯一の考えは、次のようなことをすることです:

$searchList=Get-ChildItem "all instances of the MSI Package folder"

foreach($folder in $searchList){
    $listofFiles=Get-ChildItem "search for *.msi"

    foreach($file in $listofFiles){"Logic to copy MSI from source to destination"}
}

しかし...もっと効率的な方法があるのではないかと思いました。

質問

  1. Get-ChildItem が検索する深さを制限するにはどうすればよいですか?
  2. Get-ChildItem 検索を制限するにはどうすればよいですかC:\ProgramData\flx\Output\<APP-NAME>_<TIME_STAMP>\<APP-NAME>\MSI Package
  3. 過去 15 分間にアクセスされたフォルダのみを検索するにはどうすればよいですか? MSI が既にコピーされていることがわかっているときに、フォルダーをドリルダウンするのに時間を無駄にしたくありません。

このスクリプトを全体的により効率的にする方法についての追加のアドバイスも大歓迎です。

脚本

私の現在のスクリプトはここにあります。「あなたの投稿には、コードとして適切にフォーマットされていないコードが含まれているようです」というメッセージが表示され続け、4回目の再フォーマットを試みた後、あきらめました。

4

3 に答える 3

1

CB の助けを借りて、これは私が抱えていた問題を解消する新しい検索です。

  • 検索される深さを制限するのに役立つように変更-Pathされました。C:\ProgramData\flx\Output\*\*\*\*
  • -Filterの代わりに使用され、ロジックを where 句に-Include入れます。-Exclude

Get-ChildItem -Path C:\ProgramData\flx\Output\*\*\*\* -Filter "*.msi" | where {$_.Name -notlike "*.Context.msi" -and $_.LastAccessTime -gt (Get-Date).AddMinutes(-15)}

于 2013-02-07T20:02:45.440 に答える
1

これを試すことができます

dir C:\ProgramData\flx\Output\*\*\*\*\* -filter *.msi 

.msiこれは、このレベルのすべてのファイルを検索します

C:\ProgramData\flx\Output\<APP-NAME>\_<TIME_STAMP>\<APP-NAME>\Repackaged or 'MSI Package' or whatever else present folder

再帰がなければ、これはエラーを引き起こす深すぎるフォルダーを避けます。

結果を次の場所にパイプします。

Where {$_.LastAccessTime -gt (Get-Date).AddMinutes(-15)} #be sure no action on file is taken before the dir command

また

Where {$_.LastWriteTime -gt (Get-Date).AddMinutes(-15)} #some file can be re-copied maybe
于 2013-02-07T06:03:41.803 に答える
0

使用しない場合を除いて、Get-ChildItem の再帰の深さを制限することはできません。-Recurseつまり、Get-ChildItem は深さ = 0 または N です。

アプリ名とタイムスタンプの変数を設定します。例:

$appName = "foo" 
$timestamp = Get-date -Format HHmmss
Get-ChildItem "C:\ProgramData\flx\Output\${appName}_$timestamp\$appName\MSI Package" -force -r

次のように結果をフィルタリングできます。

Get-ChildItem <path> -R | Where {$_.LastWriteTime -gt (Get-Date).AddMinutes(-15)}
于 2013-02-07T01:24:56.223 に答える