Powershell 根据早于 x 天的时间移动文件和文件夹

2023-12-21

我是 powershell 新手,正在尝试学习从一个目录到另一个目录的基本文件移动。我的目标是将超过 18 个月的文件和文件夹移动到作为计划任务运行的冷存储文件夹。我需要能够轻松修改它的目录以满足我们的需求。它需要保留文件夹结构并仅移动符合上述参数的文件。我还需要它记录它所做的一切,这样如果有什么问题我知道在哪里。 如果我运行它,它只会复制所有内容。如果我注释掉 %{Copy-Item... 那么它仅根据我的参数运行和列出并记录它。我哪里出错了或者我离基地太远了?

是的,使用 robocopy 来做到这一点很容易,但我想使用 powershell 并从中学习。

#Remove-Variable * -ErrorAction SilentlyContinue; Remove-Module *; $error.Clear();
#Clear-Host
#Days older than
$Days = "-485"
#Path Variables
$Sourcepath = "C:\Temp1"
$DestinationPath = "C:\Temp2"
#Logging
$Logfile = "c:\temp3\file_$((Get-Date).ToString('MM-dd-yyyy_hh-mm-ss')).log"

#transcript logs all outputs to txt file 
Start-Transcript -Path $Logfile -Append
Get-ChildItem $Sourcepath -Force -Recurse | 
    Where-Object {$_.LastwriteTime -le (Get-Date).AddDays($Days)} | 
    % {Copy-Item -Path $Sourcepath -Destination $DestinationPath -Recurse -Force}
Stop-Transcript

Problem

Copy-Item -Path $Sourcepath -Destination $DestinationPath -Recurse -Force

您始终为源和目标指定相同的路径。带参数-recurse您将复制整个目录$SourcePath对于每个匹配的文件。

Solution

您需要将先前管道步骤的输出提供给Copy-Item通过使用$_ (aka $PSItem) 变量,基本上使用Copy-Item在单项模式下。

试试这个(需要 .NET >= 5.0GetRelativePath方法):

Get-ChildItem $Sourcepath -File -Force -Recurse | 
    Where-Object {$_.LastwriteTime -le (Get-Date).AddDays($Days)} | 
    ForEach-Object {
        $relativeSourceFilePath = [IO.Path]::GetRelativePath( $sourcePath, $_.Fullname )
        $destinationFilePath    = Join-Path $destinationPath $relativeSourceFilePath
        $destinationSubDirPath  = Split-Path $destinationFilePath -Parent 

        # Need to create sub directory when using Copy-Item in single-item mode
        $null = New-Item $destinationSubDirPath -ItemType Directory -Force

        # Copy one file
        Copy-Item -Path $_ -Destination $destinationFilePath -Force 
    }

替代实施无需GetRelativePath(对于 .NET

Push-Location $Sourcepath   # Base path to use for Get-ChildItem and Resolve-Path

try {
    Get-ChildItem . -File -Force -Recurse | 
        Where-Object {$_.LastwriteTime -le (Get-Date).AddDays($Days)} | 
        ForEach-Object {
            $relativeSourceFilePath = Resolve-Path $_.Fullname -Relative
            $destinationFilePath    = Join-Path $destinationPath $relativeSourceFilePath
            $destinationSubDirPath  = Split-Path $destinationFilePath -Parent 

            # Need to create sub directory when using Copy-Item in single-item mode
            $null = New-Item $destinationSubDirPath -ItemType Directory -Force

            # Copy one file
            Copy-Item -Path $_ -Destination $destinationFilePath -Force 
        }
}
finally {
    Pop-Location   # restore previous location
}

顺便说一句,$Days = "-485"应替换为$Days = -485。 您当前创建一个字符串而不是数字,并依靠 Powershell 在“必要”时自动将字符串转换为数字的能力。但这并不总是有效,因此最好首先创建一个具有适当数据类型的变量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell 根据早于 x 天的时间移动文件和文件夹 的相关文章

随机推荐

  • 列表中的重复元素[重复]

    这个问题在这里已经有答案了 我有一个list在Python中 l a c e b 我想将每个元素复制到紧邻原始元素的位置 ll a a c c e e b b 应保留元素的顺序 gt gt gt l a c e b gt gt gt x f
  • 无法再发送推文:插件 com.apple.share.Twitter.post 无效

    我的应用程序使用 SLComposeViewController 发布到 Twitter 这种方法持续了几个月 然后在大约一周前突然停止了 Twitter 共享视图允许我按 发布 并且以下代码仍然到达 行 twitterComposeVie
  • 发布到 Azure 时未加载捆绑的 CSS

    从 Microsoft 提供的默认 ASP Net Web 表单模板开始 我添加了几个 CSS 文件 将其捆绑并将其添加到 Site Master 事情在本地可以工作 但在 Azure 上发布时就不行了 基于这些链接 link 1 http
  • OSX 中的侧边栏图标图像名称

    该图标是否包含在 Cocoa API 中 图标名称是什么 我读了 HIGH 但找不到参考资料 https developer apple com library mac documentation UserExperience Concep
  • 为什么我无法在 Silverlight 4 中绑定 DataGridTemplateColumn 的可见性?

    似乎仍然无法在 Silverlight 4 中绑定 DataGridTemplateColumn 的可见性属性 我做了一些谷歌搜索 似乎有一些帖子建议这样做事实上它不是 DependencyObject http forums silver
  • SwiftUI 中的免费可扩展列表有什么要求?

    在我的代码中的某个地方 我有一个非常标准的列表 其中包含以下部分 var body some View List ForEach userData groupedBookings group in Section header Text g
  • QRegExpValidator 与 QTextEdit

    QRegExpValidator 可以与 QTextEdit 小部件一起使用吗 我尝试通过 setValidator 实现 并将 qtextedit 设置为父对象 但它不起作用 你应该使用virtual QValidator State Q
  • 如何为官方 nginx Docker 镜像使用自定义 Nginx 配置?

    我有下一个docker compose file nginx build ports 80 80 443 443 links fpm fpm image php fpm ports 9000 9000 The Dockerfile命令列表是
  • 回溯外部化

    目前我有 logback 配置文件 即logback xml这是src main resources 我想设置日志记录级别 但我想在战争之外进行控制 我能想到的一种解决方案是将其外部化在属性文件中 在服务器启动时加载它并替换占位符 有更好的
  • Opengraph W3C 有效吗?

    我想知道 opengraph 标记是否是 W3C 有效的 当我尝试验证它时 出现以下错误 Line 14 Column 17 there is no attribute PROPERTY 如果它无效 会影响我的页面排名和其他搜索引擎算法吗
  • 为什么 UIFont(descriptor:size:) 比 UIFont(name:size:) 慢 200 倍?

    最近我注意到滚动的性能正在减慢 我追踪了这个问题 发现原因是使用了由UIFont 描述符 大小 https developer apple com library ios documentation UIKit Reference UIFo
  • Numpy 通过交错连接数组

    我有 4 个数组 我想将它们连接成一个交错的数组 我该怎么做呢 gt gt gt import numpy as np gt gt gt a np tile 0 5 2 gt gt gt b np tile 1 5 2 gt gt gt c
  • 使用python查找fits文件中像素的物理坐标

    我想从 python 脚本中获取给定像素的物理天空坐标 我想使用 astropy 的 WCS 但我会在 python 中做任何事情 我已经尝试过这两段代码 from astropy io import fits from astropy w
  • 打印数组 LISP 的内容

    为什么这段代码不打印出数组的内容 defun loopfn state loop for x from 0 to 2 do loop for y from 0 to 2 do aref state x y 这里我传递了一个 3x3 矩阵 它
  • 正则表达式匹配开始和结束字符串

    这看起来应该是微不足道的 但我不太擅长正则表达式 而且这对谷歌来说似乎并不容易 我需要一个以字符串 dbo 开头的正则表达式 并以字符串 fn 结尾 就我而言 我不在乎这两个字符串之间有什么字符 只要开头和结尾正确即可 这是为了匹配 SQL
  • 为什么 LIB 文件具有如此两面性的野兽?

    我正在尝试了解 Microsoft Windows 上的 LIB 文件业务 并且我刚刚有了一个发现 我希望它能够消除迄今为止阻止我清楚掌握该问题的困惑 也就是说 LIB 文件并不是其文件扩展名所表明的那种文件 cd C Program Fi
  • 颤动错误:没有名称为“displayLarge”的命名参数

    我正在开发一个应用程序 两天前我在 git 上发布了最后一次更新 此后就没有再碰过代码 现在 我打开 android studio 当我尝试运行它时 它给了我这个错误 我尝试从计算机中删除存储库 然后再次克隆它 但它不起作用 我也尝试过寻找
  • 如何在FMX(火猴)中加载大位图

    我正在尝试创建一个需要加载的漫画查看器JPG像 1000 16000 这样的大尺寸图像 我的应用程序是在 delphi FMX 中 我已经尝试过使用TImage TImageViewer TImageControl但他们都使用TBitmap
  • Mac OS X 中的环境变量

    更新 以下链接没有完整的答案 必须在两个地方设置路径或变量 一个用于 GUI 一个用于 shell 是蹩脚的 不重复 在 OS X 中设置环境变量 https stackoverflow com questions 135688 setti
  • Powershell 根据早于 x 天的时间移动文件和文件夹

    我是 powershell 新手 正在尝试学习从一个目录到另一个目录的基本文件移动 我的目标是将超过 18 个月的文件和文件夹移动到作为计划任务运行的冷存储文件夹 我需要能够轻松修改它的目录以满足我们的需求 它需要保留文件夹结构并仅移动符合