Различные результаты между "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
}
}