4

背景

有一个目录会全天自动填充 MSI 文件。我计划利用任务计划程序每 15 分钟运行一次如下所示的脚本。该脚本将搜索目录并将过去 15 分钟内创建的所有新 MSI 复制到网络共享。

在此文件夹C:\ProgramData\flx\Output\<APP-NAME>\_<TIME_STAMP>\<APP-NAME>\中还有另外两个文件夹:RepackagedMSI 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
  • 我无法控制源位置的目录结构

更新:

  • 我不知道应用程序名称或时间戳是什么。那是我无法控制的另一件事。

目前的计划

我已经阅读了有关使用-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

3 回答 3

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 回答
1

在 CB 的帮助下,这是我的新搜索,它消除了我遇到的问题。

  • 更改-PathC:\ProgramData\flx\Output\*\*\*\*帮助限制搜索的深度。
  • 用于-Filter代替-Include并将-Exclude逻辑放入 where 子句中。

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 回答
0

您不能限制 Get-ChildItem 的递归深度,除非不使用-Recurse即 Get-ChildItem 是 depth = 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 回答