Вопрос или проблема
Мое приложение регулярно записывает файл “user.config”. В результате у меня может быть несколько таких файлов, как вы можете видеть здесь:
C:\Users\DDM\AppData\Local\Microsoft\Application.exe_Url_0pxm4tjihtf4gojic1ie1emq0ikpux0l\1.0.0.0\user.config
C:\Users\DDM\AppData\Local\Microsoft\Application.exe_Url_2b3b4tyfmzkmjhm51ejgkixpxa1mj5mv\1.0.0.0\user.config
C:\Users\DDM\AppData\Local\Microsoft\Application.exe_Url_35225euvnelhwk1uagjvfdpuat5ri4pq\1.0.0.0\user.config
C:\Users\DDM\AppData\Local\Microsoft\Application.exe_Url_5n2gl0ysqrdxoqfoamypqiowrjzi1urz\1.0.0.0\user.config
Поскольку эти файлы находятся внутри директории “AppData”, поиск Windows не работает:
Есть ли какой-либо параметр или переключатель, который я могу добавить к DIR /S
, чтобы добавить дату последнего изменения (как ls -l
в UNIX)?
Спасибо заранее
Редактировать: попытка forfiles:
Тем временем я изобрел следующую команду forfiles
:
forfiles /S /M user.config /C "cmd /c echo @path ":" @fdate, @ftime"
Однако это вызывает множество ошибок “Доступ запрещен”.
Есть ли 2>/dev/null
, как в UNIX?
Есть ли какой-либо параметр или переключатель, который я могу добавить к DIR /S, чтобы добавить дату последнего изменения (как ls -l в UNIX)?
Встроенная команда dir
в Cmd уже отображает это по умолчанию. Вы, вероятно, скрыли это, используя /B
в своем скрипте.
Аналогично, команда PowerShell Get-ChildItem возвращает объекты, у которых есть свойство .LastWriteTime (также отображается по умолчанию).
dir ~\AppData\Local\Microsoft\Application.exe_*\1.0.0.0\user.config | select LastWriteTime, FullName
Есть ли 2>/dev/null, как в UNIX?
Есть, но нулевое устройство – это NUL
или NUL:
. (Технически также \\.\GLOBALROOT\Device\Null
или что-то в этом роде, но я не думаю, что это работает в Cmd.)
Я думаю, что PowerShell предпочитает 2> $null
(потоки в PowerShell странные).
Я только что нашел следующее: 2>nul
.
Я проверил это, и это сработало:
forfiles /S /M user.config /C "cmd /c echo @path ":" @fdate, @ftime" 2>nul
Это дает список файлов, который я искал, без каких-либо сообщений об ошибках.
Ответ или решение
Чтобы определить, какой из файлов "user.config" является последним по времени изменения, необходимо использовать правильные инструменты и команды Windows, так как стандартный поиск Windows по умолчанию не охватывает директорию AppData.
Использование команды DIR
По умолчанию команда DIR
уже выводит дату и время последнего изменения файлов. Для этого просто выполните следующую команду:
DIR "C:\Users\DDM\AppData\Local\Microsoft\Application.exe_*\1.0.0.0\user.config"
Однако, если вы хотите более подробный вывод, например, для упрощённой обработки информации, можно использовать другие подходы.
Использование forfiles
Вы нашли хороший способ использовать forfiles
для сбора информации о файлах. Вот пример команды:
forfiles /S /M user.config /C "cmd /c echo @path : @fdate @ftime" 2>nul
Эта команда будет искать все файлы с именем "user.config" в указанной директории и её подкаталогах, выводить путь к файлу, дату и время последнего изменения, при этом игнорируя сообщения об ошибках (например, "Access Denied"). Описание параметров:
/S
— рекурсивный поиск в подкаталогах./M user.config
— фильтрация по имени файла./C
— команда, которая будет выполнена для каждого найденного файла.2>nul
— перенаправление сообщений об ошибках в «черную дыру», так называемое устройство NUL.
Использование PowerShell
Если вы предпочитаете более гибкий подход, PowerShell предоставляет дополнительные возможности. Например, следующая команда позволяет вывести время последнего изменения файлов в удобном формате:
Get-ChildItem ~\AppData\Local\Microsoft\Application.exe_*\1.0.0.0\user.config | Select-Object LastWriteTime, FullName
Выбор последнего изменения
Теперь, когда у вас есть список всех файлов "user.config" с датами последнего изменения, определите файл с самой поздней датой. Для этого можно использовать команду PowerShell:
Get-ChildItem ~\AppData\Local\Microsoft\Application.exe_*\1.0.0.0\user.config | Sort-Object LastWriteTime -Descending | Select-Object -First 1
Заключение
Таким образом, чтобы определить, какой из файлов "user.config" является последним, вы можете использовать как команду forfiles
, так и PowerShell, в зависимости от ваших предпочтений. Метод с PowerShell может быть более удобным и предлагает больше возможностей для дальнейшей обработки данных, в то время как forfiles
является более простым и прямолинейным вариантом для быстрых задач.