Различные результаты между "PowerShell ISE" и "Запускать с PowerShell"

У меня два простых однострочных "скрипта". Они проверяют, сколько лет определенным файлам в определенных папках. Один выводит вывод на экран, а другой записывает вывод в текстовый файл на рабочем столе. Оба файла сценария ".ps1" сохраняются на рабочем столе. Запуск любого из файлов ".ps1" с помощью "Запуск с PowerShell" приводит к неверным результатам. При запуске файлов.ps1 через PowerShell ISE результат будет другим (и правильным).

Первый скрипт:

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

Второй скрипт:

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

Пример скриншота с двумя разными результатами для первого скрипта:

https://i.imgur.com/RWVK3W3.jpg

Есть идеи, почему есть разные результаты?

1 ответ

Решение

Вы приводите даты к строкам, и это дает разные результаты в консоли ISE и PowerShell.

Посмотри на свой from073.rar файл:

  • Дата ISE: 10/05/2015
  • Дата консоли PowerShell: 5/10/ 2015

Тебе лучше избавиться от .ToShortDateString() и сравнивайте даты напрямую. Смотрите этот вопрос: Powershell: Сравнение дат

Несмотря на то, что строки представлены по-разному в ISE и в консоли PowerShell, сравнение между яблоками и яблоками, поэтому результаты должны быть одинаковыми.

Да, но ваши "яблоки" в данном случае - это коды символов, которые, я уверен, не то, что вы хотели сравнить. Пример:

  • 'a' -gt 'b' является false, потому что код символа a ниже, чем код символа b,

  • 'ac' -gt 'ab' является true, потому что код символа a одинаков для обеих строк, но следующий символьный код левой строки (c) больше, чем второй символьный код правой строки (b).

Итак, когда вы запускаете свой код в ISE, который использует dd/mm/yyyy формат, ваш код просто сравнивается первым dd часть и игнорирует mm/yyyy, потому что это случается так же. И вы получаете правильные результаты по чистой случайности. В консоли PowerShell формат даты mm/dd/yyyy, так что ваш код ломается как следует.

Это моя новая строка:

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

Но сравнение не работает.

Здесь вы идете снова: вы используете -Format d, который преобразует объект даты в строку. И вы уже знаете, к чему это приводит.

Если вы хотите получить файлы старше одного дня, ваш код должен выглядеть следующим образом (обратите внимание, как сравниваются два объекта DateTime напрямую, без каких-либо строк):

Get-ChildItem -Filter '*.rar' |
        Foreach-Object {
            if($_.LastWriteTime -lt (Get-Date).AddDays(-1))
            {
                '{0} {1}' -f $_.Name, $_.LastWriteTime
            }
        } 
Другие вопросы по тегам