如何使用 power shell 更新所有文件的时间戳

如何使用 power shell 更新所有文件的时间戳

我想编写一个脚本来一次更新目录中 5 个文件的时间戳。例如,如果文件夹中有 15 个文件,则它应首先更新 5 个文件的时间戳,等待一段时间,或者应要求用户输入任意键来更新另一组 5 个文件,然后再等待/输入 5 个文件,依此类推。

下面我有一个命令可以一次性更新文件夹中所有文件的时间戳,但你能告诉我满足我的要求的命令吗?

$currentTime = Get-Date
$folderItems = Get-ChildItem $dir

foreach ($item in $folderItems)
{
    $item.LastWriteTime = $currentTime
    $currentTime = $currentTime.AddMinutes(0)
}
$folderItems

答案1

只需进行微小的改动,将循环包装在另一个 for 循环中就可以解决问题 - 例如:

for ($i = 0; $i -lt $folderItems.Count; $i += 5) {
    $items = $folderItems[$i..($i+4)]
    foreach ($item in $items) {
        Write-Verbose "Modifying [$($item.FullName)]"
        # Modify LastWriteTime here
    }
    Write-Host "Modified [$($items.Count)] files. " -NoNewline
    Read-Host -Prompt 'Please press any key to continue...'
}

它将设置$i为零,循环直到$i小于项数$folderItems(计数),并且$i每次循环递增 5。
然后它获取$folderItems索引为 的$i$i+4,并处理它们。
然后它写入一些文本,并使用Read-Host等待用户输入,然后再继续。

但是,您应该知道,原始循环不会修改文件的 LastWriteTime - 而是修改您存储在中的 PSObject 的属性$folderItems

您可能应该使用Set-ItemProperty或阅读 romeo-ninov 关于模拟的评论touch

例子:

Set-ItemProperty -Path $itemPath -Name LastWriteTime -Value $currentTime

您甚至可以foreach ($item in $items) {...}用简单的管道$items替换Set-ItemProperty

例子:

$items = $folderItems[$i..($i+4)]
$items | Set-ItemProperty -Name LastWriteTime -Value $currentTime

答案2

获取触摸替代Set-FileTime这里

  • 按索引迭代 var $folderItems 并
  • 如果索引 + 1 模数 5 为零,则询问/等待

$currentTime = Get-Date
$folderItems = Get-ChildItem $dir

For ($i=0;$i -lt $folderItems.count;$i++){
    "{0,5} {1}" -f $i,$folderItems[$i].FullName
    Set-FileTime $folderItems[$i].FullName
    if ( ($i+1)%5 -eq 0 ){
        Read-Host "enter any key to update another set of 5 files"
        #Start-Sleep -Seconds 5
    }
}

注释掉Read-HostStart-Sleep
编辑插入显示“{0,5} {1}” -f $i,$folderItems[$i].FullName

示例输出:

    0 Q:\Test\2017-04\15
    1 Q:\Test\2017-04\06
    2 Q:\Test\2017-04\01
    3 Q:\Test\2017-04\20
    4 Q:\Test\2017-04\12
enter any key to update another set of 5 files:

答案3

非常感谢你的帮助...实际上我想查看文件更新的时间戳,因此添加了“$item | Set-ItemProperty -Name LastWriteTime -Value $currentTime”命令..我对解决方案很满意

对于 ($i = 0; $i -lt $folderItems.Count; $i += 5) {

$items = $folderItems[$i..($i+4)]
foreach ($item in $items) {
    #Write-Verbose "Modifying [$($item.FullName)]"
    $item | Set-ItemProperty -Name LastWriteTime -Value $currentTime
    # Modify LastWriteTime here
}
Write-Host "Modified [$($items.Count)] files. " -NoNewline
dir
Read-Host -Prompt 'please enter to copy next set of files'

}

相关内容