1

У меня два простых однострочных "скрипта". Они проверяют, сколько лет определенным файлам в определенных папках. Один выводит вывод на экран, а другой записывает вывод в текстовый файл на рабочем столе. Оба файла сценария ".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

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

1

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

1 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .