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


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:

1

Alguma idéia porque existem resultados diferentes?


1


origem




Respostas:


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

Olhe para sua from073.rar Arquivo:

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

É melhor você se livrar de .ToShortDateString() e compare datas diretamente. Veja esta pergunta: Powershell: Comparando datas

Mesmo que as cordas sejam apresentadas diferentemente no ISE e no   Console PowerShell a comparação é de maçãs em maçãs para os resultados   deve ser o mesmo.

Sim, mas seu "maçãs" Nesse caso, são códigos de caracteres, o que, tenho certeza, 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 caracteres da cadeia esquerda (c) é maior que o segundo código de caractere da string correta (b).

Então, quando você executa seu código no ISE que usa dd/mm/yyyy formato, seu código compara primeiro dd parte e ignora mm/yyyyporque acontece que é o mesmo. E você está obtendo resultados corretos por puro acidente. No formato de data do console do PowerShell é mm/dd/yyyy, então o seu código é quebrado como deveria.

Esta é minha nova linha:

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)
        }
    }

Mas a comparação não está funcionando.

Aqui está você de novo: 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 Data hora objetos comparados diretamente, sem strings envolvidas):

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

1



Eu tenho duas perguntas de acompanhamento: 1) Mesmo que as cadeias de caracteres sejam apresentadas de forma diferente no ISE e no console do PowerShell, a comparação é de maçãs para maçãs, portanto, os resultados devem ser os mesmos. Na captura de tela acima, no ISE, a saída exibe nomes de arquivos que não são exibidos no console do PowerShell e vice-versa. Por que é que? - eliko
2. esta é a minha nova linha: 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)} }  Mas a comparação não está funcionando. Eu criei uma pasta de teste com 10 arquivos. O resultado da comparação não inclui arquivos com mais de um dia. Por favor veja captura de tela de exemplo - eliko
@eliko Veja resposta atualizada. - beatcracker