Помогите с пакетным файлом, который ищет и копирует скрытый файл в определенную директорию - PullRequest
0 голосов
/ 30 декабря 2018

Раздражает необходимость всегда вручную искать в CMD и xcopy скрытый файл, может ли кто-нибудь, кто умеет писать, помочь мне?

Я использую эти 2Команды: Во-первых, я открываю CMD в FOLDER2 и ввожу эту команду, чтобы найти скрытый файл в скрытой случайной подпапке: dir /s /b | find "robotknow"

( robotknow не полное имя файла, только его часть.)

И затем, когда он находит скрытый файл в произвольном подкаталоге, я копирую весь путь, включая все имя файла с окончанием.

Xcopy /h *The whole path including the filename and ending* C:\hello


Мои папки:

$sourceDir = 'C:\Users\USER\AppData\Local\Packages\FOLDER1\FOLDER2'

$targetDir = 'C:\hello'

Поэтому я хочу создать пакет, которыймог бы найти эту строку "robotknow" и скопировать полное имя файла в мой tagetdir.

Возможно ли это?Я пытаюсь выучить команды, но пакетирование сложнее, если мне что-то неясно, пожалуйста, спросите меня, спасибо!

Редактировать:
Я нашел несколько команд, которые могут быть полезны, но я не знаю, как их использовать, чтобы он работал.

$searchStrings = Для этогопоиск по указанной выше строке: "robotknow"
и
Copy-Item $_.FullName $targetpath

Примером может быть:

Имя файла содержит имя "robotknow" , и я хочу скопировать его.
Скопировать файл, который я ищу, чтобы скопировать его в подпапку FOLDER2 , которая является скрытой случайной папкой, которую я не могу найти: %LocalAppData%\Packages\FOLDER1\FOLDER2\THE-hidden-RANDOM-made-sub-DIR.

Скопируйте его в конечный каталог c:\hello Последний каталог, просто: c:\hello.

Под скрытым я подразумеваю, что не могу видеть в проводнике файлов, графическом интерфейсе Windows, и если я помещаю эту простую команду в CMD dir, чтобы показать скрытую случайную папку, в которой находится файл, они не отображаются.,

Файл появляется в CMD, только если я ввожу эту команду dir /s /b | find "robotknow", когда я нахожусь в FOLDER2 .
Только после этого я могу найти скрытую произвольно созданную папку / папку иполный скрытый путь к нему (файлу).

1 Ответ

0 голосов
/ 30 декабря 2018

Я предлагаю следующий код пакетного файла для этой задачи:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "SourceFolder=%LocalAppData%\Packages\FOLDER1\FOLDER2"
set "TargetFolder=C:\hello"
for /F "delims=" %%I in ('dir "%SourceFolder%\*robotknow*" /A-D /B /S 2^>nul') do %SystemRoot%\System32\xcopy.exe "%%~dpI*" "%TargetFolder%\" /C /E /H /K /Q /R /Y >nul
endlocal

Команда FOR с опцией /F запускает отдельный командный процесс с cmd.exe /C (точнее * 1008)*) в фоновом режиме для запуска командной строки:

dir "C:\Users\{username}\AppData\Local\Packages\FOLDER1\FOLDER2\*robotknow*" /A-D /B /S 2>nul

DIR выводит для обработки STDOUT фонового командного процесса

  • простоимена всех файлов , совпадающих с шаблоном подстановки *robotknow* из-за опции /A-D (атрибут не каталог)
  • даже в файле со скрытым атрибутом, установленным из-за использования опции /A ине исключая атрибут скрытый
  • в голом формате из-за опции /B
  • с полным указанием пути из-за опции /S
  • , найденной в указанном каталоге или любом подкаталоге, также потому, чтоопции /S.

Возможно, что DIR не найдет ни одной записи файловой системы, соответствующей этим критериям, и в этом случае выводит сообщение об ошибке для обработки STDERR.Это сообщение об ошибке подавляется путем перенаправления его на устройство NUL .

. Прочтите статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul.Оператор перенаправления > должен быть экранирован с помощью символа вставки ^ в FOR командной строке, чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , котораявыполняет встроенную командную строку dir в отдельном командном процессе, запущенном в фоновом режиме.

FOR с параметром /F захватывает все выходные строки для обработки STDOUT из запущенногоКоманда обрабатывает и обрабатывает их построчно после того, как запущенный cmd.exe завершился сам.

FOR игнорирует пустые строки, которые здесь не встречаются. FOR по умолчанию игнорирует также все строки, начинающиеся с точки с запятой, поскольку eol=; используется по умолчанию для символа конца строки.Но полное имя файла, состоящее из полного пути к файлу, имени файла и расширения файла, не может начинаться с ;, поэтому в этом случае можно сохранить опцию конца строки по умолчанию. FOR разбивает строки по умолчанию на подстроки с использованием обычного пробела и символа горизонтальной табуляции в качестве разделителей строк и назначает только первую разделенную пробелом / табуляцией подстроку указанной переменной цикла.Такое поведение разделения строк здесь нежелательно, поскольку путь к файлу может содержать символ пробела.По этой причине опция delims= используется для определения пустого списка разделителей, который запрещает разделение строк.

Итак, FOR присваивает указанной и регистрозависимой интерпретируемой переменной цикла Iполное имя файла найдено и выведено DIR и запускает команду XCOPY .

XCOPY выполняется с источником, который является полным квалифицированным путемнайденного файла, на который ссылается %%~dpI, всегда заканчивающегося обратной косой чертой, объединенной с подстановочным знаком *, а целевой каталог является целевой папкой C:\hello.

Добавленная обратная косая черта в конце пути к каталогу назначения делает его на 100% яснымдля XCOPY , что местом назначения является каталог, а не файл, что предотвращает запрос, если место назначения означает каталог или файл.\ в конце также делает ненужным использование опции /I, а XCOPY создает всю целевую структуру каталогов, если необходимо.

Другие опции XCOPY предназначены для действительнокопирование всех файлов, включая файлы со скрытым атрибутом, установленным в каталог, содержащий файл, соответствующий шаблону подстановки *robotknow* со всеми подкаталогами, включая пустые подкаталоги, в каталог назначения с сохранением атрибутов, включая атрибут только для чтения.

Для понимания используемых команди как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • dir /?
  • echo /?
  • endlocal /?
  • set /?
  • setlocal /?
  • xcopy /?

См. Также список предопределенных переменных среды Windows .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...