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

1669
eliko

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

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

cd G:\moveh\back Get-ChildItem -filter "*.rar" | Foreach-Object { if ( ((get-date).toshortdatestring() ) -gt ($_.lastwritetime.toshortdatestring() ) ) { " " -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
beatcracker

Вы приводите даты к строкам, и это дает разные результаты в консоли 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 )) { " " -f $_.name, (get-date $_.lastwritetime -Format d) } } 

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

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

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

Get-ChildItem -Filter '*.rar' | Foreach-Object { if($_.LastWriteTime -lt (Get-Date).AddDays(-1)) { ' ' -f $_.Name, $_.LastWriteTime } }  
У меня есть два последующих вопроса: 1) Несмотря на то, что строки представлены в ISE по-разному и в консоли PowerShell, сравнение между яблоками и яблоками, поэтому результаты должны быть одинаковыми. На скриншоте выше, в ISE выходные данные отображают имена файлов, которые не отображаются в консоли PowerShell и наоборот. Это почему? eliko 9 лет назад 0
2. Это моя новая строка: `Get-ChildItem -filter" * .rar "| Foreach-Object " -f $ _. Name, (get-date $ _.lastwritetime -Format d)}} `Но сравнение не работает. Я создал тестовую папку с 10 файлами. Результат сравнения не включает файлы старше одного дня. Пожалуйста [см. Пример скриншота] (http://imgur.com/CBu4OGk) eliko 9 лет назад 0
@eliko Смотрите обновленный ответ. beatcracker 9 лет назад 0