我想编写一个脚本来一次更新目录中 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-Host
或Start-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'
}