【问题标题】:Recurse to directory-level only using PowerShell仅使用 PowerShell 递归到目录级
【发布时间】:2015-09-26 04:18:08
【问题描述】:

有没有办法只递归到最后一个目录级别?

我正在尝试执行以下脚本:

$sourcepath = "\\xx.xxx.xx.xxx\target";
$inputdate = '2014-06-02';
$sourcepath
#Get-ChildItem -path $sourcepath
Get-Date;
Get-ChildItem -path $sourcepath -recurse | where-object {$_.fullname.contains("XX") -and $_.fullname.contains($inputdate)} |
foreach-object {
    $_.fullname;
}
Get-Date;

上面的源码目录\xx.xxx.xx.xx\ftpcopy,里面有很多文件夹,比如XX,X1,X2等,每个子文件夹里面都有'2014-06-01'这样的文件夹, '2014-06-02' 等

在每个子文件夹中都有文件。这些子文件夹总共有 68 个,并且所有这些子文件夹都包含文件。我的目标是使用脚本仅列出文件夹中文件的名称,\xx.xxx.xx.xxx\ftpcopy\XX\2014-06-02。

稍后我想概括一下,当我传递参数'sourcepath'时,它会在任何子文件夹'XX','X1','X2'等下列出文件夹'2014-06-02'下的文件名和“输入日期”。

当我执行这个脚本时,它需要 45 分钟才能执行,这非常长。我认为这是由于每个子文件夹中有很多文件;它还必须递归所有这些以找到匹配的模式。

如果有办法只递归到最后一个文件夹级别,例如“2014-06-02”,那么它可以使脚本运行得更快。 xx.xxx.xx.xxx 是我正在尝试访问的远程服务器。我该怎么做?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    我最初的想法是尝试仅列出一个文件夹,并可能过滤 $inputdate(我不信任文件系统提供商的过滤能力,所以我会在之后过滤),然后可能只是在这些文件夹上运行 GCI .

    所以,大致如下:

    $sourcepath = "\\xx.xxx.xx.xxx\ftpcopy"
    $inputdate = '2014-06-02'
    get-childitem -path $sourcepath -recurse -directory|?{$_.Name -match $inputdate -and $_.fullname.contains("XX")}| %{ GCI $_.fullname }
    

    如果这是您希望能够提供给 XX 的内容,并且日期可能会更适合您。

    Function Get-FTPFiles{
    Param(
        $InputDate = (Get-Date).ToString('yyyy-MM-dd'),
        $sourcepath = "\\xx.xxx.xx.xxx\ftpcopy",
        $XX = '.'
    )
        get-childitem -path $sourcepath -recurse -directory|?{$_.Name -match $inputdate -and $_.fullname -match "$XX"}| %{ GCI $_.fullname }
    }
    

    然后您可以不带参数调用它来获取任何文件夹中具有当天日期的所有文件,或指定日期、XX 文件夹和/或服务器路径。

    Get-FTPFolders
    

    Get-FTPFolders -InputDate "2014-06-24" -XX "X3"
    

    【讨论】:

    • 感谢以上。我尝试了上述方法,但出现以下错误:Get-ChildItem:找不到与参数名称“目录”匹配的参数。
    • 啊,好的,您使用的是旧版本的 PowerShell。我建议换掉 mjolinor 建议的那一行,因为您使用的是旧版本的 powershell。
    • 谢谢。我正在使用 mjolinor 建议的交换,它正在工作。
    【解决方案2】:

    我会交易这个:

    get-childitem -path $sourcepath -recurse -directory|?{$_.Name -match $inputdate -and $_.fullname.contains("XX")}| %{ GCI $_.fullname }
    

    (cmd /c dir $sourcepath /b /s /ad) -match $inputdate -match '\\xx\\' | GCI
    

    编辑:

    【讨论】:

    • 当我执行上述操作时没有任何反应。屏幕上没有输出。
    • 如果你运行这么多:(cmd /c dir $sourcepath /b /s /ad) 你得到一个目录列表吗?
    • 是的,当我只运行上述脚本行时,它会列出目录。运行大约需要 5 米
    • 如果它返回目录字符串,并且它们中的任何一个都匹配 $Inputdate 并且在它们的路径中有 \xx\ 它应该返回那些。 5 分钟的跑步似乎太过分了。该文件夹结构中有多少个目录?
    • 在 xx.xxx.xx.xxx/ftpcopy 下有 53 个文件夹。然后在这 53 个文件夹中的每个文件夹中大约有 60-70 个文件夹。然后 60-70 个文件夹中的每一个都有文件(每个文件夹中可能有 1 到 100 个文件)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2020-10-07
    • 2011-03-10
    • 2017-10-26
    • 2010-12-17
    相关资源
    最近更新 更多