Como atualizar o registro de data e hora de todos os arquivos com shell de energia

0

Eu quero escrever um script para atualizar o timestamp de 5 arquivos em um diretório por vez. Por exemplo, se há 15 arquivos em uma pasta, ele deve primeiro atualizar a data e hora de 5 arquivos esperados por algum tempo ou deve pedir ao usuário para inserir qualquer chave para atualizar outro conjunto de 5 arquivos seguido por outra espera / entrada e 5 arquivos e assim por diante.

Abaixo eu tenho o comando para atualizar o registro de data e hora de todos os arquivos em uma pasta de uma só vez, mas você pode por favor me dizer o comando para cumprir minha exigência?

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

foreach ($item in $folderItems)
{
    $item.LastWriteTime = $currentTime
    $currentTime = $currentTime.AddMinutes(0)
}
$folderItems
    
por amarnadh manikanta 24.04.2017 / 10:02

3 respostas

0

Com pequenas alterações, envolver o loop em outro loop for deve fazer o truque - por exemplo:

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...'
}

Isso define $i para zero, faz um loop enquanto $i é menor que a quantidade de itens em $folderItems (a Contagem) e incrementa $i em 5 cada loop.
Em seguida, ele obtém itens em $folderItems com um índice de $i a $i+4 e os processa.
Em seguida, ele grava algum texto e usa Read-Host para aguardar a entrada do usuário antes de continuar.

No entanto, você deve saber que o seu loop original não modifica o LastWriteTime do arquivo - em vez disso, modifica a propriedade do PSObject que você armazenou em $folderItems .

Você provavelmente deve usar Set-ItemProperty ou ler o comentário feito por romeo-ninov sobre emulação de touch .

Exemplo:

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

Você pode até mesmo substituir o foreach ($item in $items) {...} simplesmente por canalizar $items em Set-ItemProperty !

Exemplo:

$items = $folderItems[$i..($i+4)]
$items | Set-ItemProperty -Name LastWriteTime -Value $currentTime
    
por 24.04.2017 / 13:00
0

Receba um substituto por toque Set-FileTime de aqui

  • iterar os var $ folderItems por índice e
  • se o índice + 1 módulo 5 for zero, faça / espere
$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
    }
}

Comente Read-Host ou Start-Sleep
Editar a exibição inserida "{0,5} {1}" -f $ i, $ folderItems [$ i] .FullName

Exemplo de saída:

    0 Q:\Test17-04
    1 Q:\Test17-04
    2 Q:\Test17-04
    3 Q:\Test17-04
    4 Q:\Test17-04
enter any key to update another set of 5 files:
    
por 24.04.2017 / 13:19
0

Muito obrigado pela ajuda ... na verdade, quero ver o registro de data e hora atualizado do arquivo, de modo que foi adicionado "$ item | Set-ItemProperty -Name LastWriteTime -Value $ currentTime" o comando ... estou satisfeito com o solução

para ($ 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'

}

    
por 24.04.2017 / 19:16