Для & найти команду

Мой сценарий:

cd\
set Directory=Directory
set Filename=Filename
set Date Created=Date Created
set Date Modified=Date Modified
set Date Accessed=Date Accessed
set Size=Size

Echo %Directory%,%Filename%,%Date Created%,%Date Modified%,%Date    Accessed%,%Size% >>C:\MyText.csv

For /r C: %%a in ("*.exe" "*.msi") Do (
@echo %%a

For /f "tokens=1* delims=]" %%b in ('dir /tc "%%a" ^| find /n " " ^| find "[6]"') Do echo %%c >>C:\MyText.csv

For /f "tokens=1* delims=]" %%b in ('dir /tw "%%a" ^| find /n " " ^| find "[6]"') Do echo %%c >>C:\MyText.csv

For /f "tokens=1* delims=]" %%b in ('dir /ta "%%a" ^| find /n " " ^| find "[6]"') Do echo %%c >>C:\MyText.csv
)
@pause

Я хотел удалить [6] и показать только 10.09.2018 14:22 xxxxx.exe

Roy Ho 10.09.2018 09:31

Думаю, вам подойдет echo %~ftza. Нет необходимости использовать dir и фильтрацию по find. Итак, после того, как вы узнали, как удалить [6], я предлагаю вам использовать изученную технику там, где это действительно необходимо.

sst 10.09.2018 10:02

Или используйте echo %~nxtza, если вам не нужна полная информация о пути. Это будет более точно имитировать выходной формат dir /ta. хотя я не уверен, как это может быть полезно, поскольку вы выполняете рекурсивный поиск и перечисленные файлы будут из разных каталогов.

sst 10.09.2018 10:20

Вы используете две команды find только для получения 6-й строки вывода. Другой способ сделать это - использовать переменную в вашем скрипте (назовем ее lineNumber) и инициализировать ее значением 0, затем поместить set /a lineNumber += 1 в ваш цикл for и выводить только в том случае, если оно равно 6. (Извините, у меня нет времени писать код, но, может быть, кто-то другой может)

DodgyCodeException 10.09.2018 10:45

а как сделать так, чтобы 6-я строчка именно то, что вам нужно? потому что вы даже не отсортировали вывод dir

phuclv 10.09.2018 11:24

Я только что рассмотрел это более подробно. Шестая строка - это фактически первая строка, которая фактически показывает детали каталога для конкретного файла в выводе dir.

DodgyCodeException 10.09.2018 12:11
0
6
117
3

Ответы 3

Вы должны разделить вывод своей команды. В лучшем случае используйте для этого другой цикл for /f:

For /r C: %%a in ("*.exe" "*.msi") do (
  @echo %%a
  for /f "tokens=1* delims=]" %%b in (' Dir /ta "%%a" ^| find /n " " ^| find "[6]"') do echo %%c
)

Он разделяет вывод dir на %%b = [6 и %%c = 10/09/2018 02:22 PM xxxxxxx.exe.

РЕДАКТИРОВАТЬ на основе новой информации в вопросе:

сначала получите все требуемые данные, а затем повторите всю строку.

@echo off
setlocal enabledelayedexpansion
(
  Echo Directory,Filename,Date Created,Date Modified,Date Accessed,Size
  For /r C: %%a in ("*.exe" "*.msi") Do (
    For /f "tokens=1,2" %%b in ('dir /tc "%%a" ^| findstr /b "[0-9]"') Do set "tc=%%b %%c"
    For /f "tokens=1,2" %%b in ('dir /tw "%%a" ^| findstr /b "[0-9]"') Do set "tw=%%b %%c"
    For /f "tokens=1,2" %%b in ('dir /ta "%%a" ^| findstr /b "[0-9]"') Do set "ta=%%b %%c"
    echo %%~dpa,%%~nxa,!tc!,!tw!,!ta!,%%~za
  )
)>C:\MyText.csv

Перенаправление выполняется только один раз, чтобы избежать открытия / записи / закрытия файла для каждой строки.

Приведенный выше сценарий не работает должным образом .. Пожалуйста, сообщите ему еще раз.

Roy Ho 10.09.2018 10:07

извини, я забыл сбежать из труб. Попробуй еще раз, пожалуйста.

Stephan 10.09.2018 10:20

Большое вам спасибо .. Могу я задать еще один вопрос?

Roy Ho 10.09.2018 11:34

Мне также нужно будет отобразить каталог файлов .. Как я могу это сделать?

Roy Ho 10.09.2018 11:35

вы должны предоставить пример желаемого результата (отредактируйте его в своем вопросе). Думаю, другие комментаторы и ответчики правы.

Stephan 10.09.2018 14:27

Пожалуйста, найдите выше мой текущий сценарий.

Roy Ho 11.09.2018 07:41

См. Мою правку (надеюсь, я правильно понял ваш вопрос). Я также реализовал другой способ получить правильную строку.

Stephan 11.09.2018 20:59

Кажется, вы используете find /n " " | find "[6]" только для того, чтобы получить 6-ю строку вывода dir (которая является строкой, в которой перечислены сведения о файле, а другие строки являются строками заголовка и сводки).

Более простой способ сделать это:

For /r C: %%a in ("*.exe" "*.msi") do (
  echo %%a
  Dir /ta %%a | find "/"
)

Это ищет "/" в дате, которая отображается в той же строке, что и файл. Этот символ не появляется в заголовке или сводке.

Одно предостережение заключается в том, что предполагается, что ваша локаль использует "/" в качестве разделителя даты (что имеет место в большинстве стран).

Кстати, время последнего доступа не всегда может быть записано. См. Этот вопрос: пакетный скрипт, который сообщает мне, когда последний раз был доступ к файлу

Кажется, вам просто нужны date и time или имя файла с его диском и путем:

просто сделайте:

For /r D: %a in ("*.exe" "*.msi") do echo %~dpnta

подробнее о подстановке переменных при выполнении for /? из cmdline.

Но это дает дату / время модификации, тогда как dir / ta дает дату / время доступа, не совсем то же самое.

DodgyCodeException 10.09.2018 15:52

@DodgyCodeException true, но OP не указал, хотя мы могли только догадываться, что ему нужно время доступа на основе переключателя / ta, но если нет, я помещаю его там. Спасибо

Gerhard 10.09.2018 15:57

Другие вопросы по теме