Resultados diferentes entre o “PowerShell ISE” e o “Executar com o PowerShell”

1

Eu tenho dois simples "scripts" de uma linha. Eles verificam quantos anos há determinados arquivos em determinadas pastas. Um exibe a saída na tela e o outro grava a saída em um arquivo de texto na área de trabalho. Ambos os arquivos de script ".ps1" são salvos na área de trabalho. A execução de arquivos ".ps1" usando "Executar com o PowerShell" obtém resultados que não estão corretos. Ao executar arquivos ".ps1" por meio do PowerShell ISE, o resultado é diferente (e correto).

O primeiro script:

cd G:\moveh\back
Get-ChildItem -filter "*.rar" | Foreach-Object {  if ( ((get-date).toshortdatestring() ) -gt ($_.lastwritetime.toshortdatestring() )  ) { "{0}   {1}" -f $_.name,$_.lastwritetime.toshortdatestring()} }

cmd /c pause

O segundo script:

Get-ChildItem $allfolders | where {$_.Name -notlike "*closed"} | gci -   Recurse -File -filter "Data.rar" | where {( ($_.lastwritetime.toshortdatestring()) -lt ((get-date).AddDays(-1).ToShortDateString() ) ) } | format-table -autosize -Property Directory, Name, LastWriteTime > C:\Users\itsupport\Desktop\Files_2b_updated_DB.txt

Uma captura de tela de exemplo com os dois resultados diferentes para o primeiro script:

Alguma idéia de por que existem resultados diferentes?

    
por eliko 11.05.2015 / 09:53

1 resposta

1

Você está enviando datas para strings e está produzindo resultados diferentes no console do ISE e do PowerShell.

Veja seu arquivo from073.rar :

  • Data do ISE: 10/05 / 2015
  • Data do console do PowerShell: 5/10 / 2015

É melhor você se livrar de .ToShortDateString() e comparar as datas diretamente. Veja esta pergunta: Powershell: comparando datas

Even though the strings are presented differently in ISE and in the PowerShell console the comparison is apples to apples so the results should be the same.

Sim, mas suas "maçãs" neste caso são códigos de caracteres, o que é certo que não é o que você queria comparar. Exemplo:

  • 'a' -gt 'b' é false , porque o código de caractere de a é menor que o código de caractere de b .

  • 'ac' -gt 'ab' é true , porque o código de caractere de a é o mesmo para as duas cadeias, mas o próximo código de caractere da cadeia esquerda ( c ) é maior que o segundo código de caractere a string correta ( b ).

Assim, quando você executa seu código no ISE que usa o formato dd/mm/yyyy , seu código compara primeiro dd part e ignora mm/yyyy , porque é o mesmo. E você está obtendo resultados corretos por puro acidente. No formato de data do console do PowerShell é mm/dd/yyyy , portanto, seu código é interrompido como deveria.

This is my new line:

Get-ChildItem -filter "*.rar" |
    Foreach-Object {
        if((get-date $_.lastwritetime -Format d) -lt (Get-Date -Format d ))
        {
            "{0} {1}" -f $_.name, (get-date $_.lastwritetime -Format d)
        }
    }

But the comparison is not working.

Aqui está novamente: você está usando -Format d , que converte o objeto date em string. E você já sabe o que isso leva.

Se você deseja obter arquivos com mais de um dia, seu código deve ficar assim (observe, como dois DateTime objetos comparados diretamente, sem strings envolvidas):

Get-ChildItem -Filter '*.rar' |
        Foreach-Object {
            if($_.LastWriteTime -lt (Get-Date).AddDays(-1))
            {
                '{0} {1}' -f $_.Name, $_.LastWriteTime
            }
        } 
    
por 13.05.2015 / 01:18