Как вы ищите в каталоге и принимаете меры? - PullRequest
0 голосов
/ 21 июня 2019

Я хочу создать командный файл, который просеивает каталог, полный компьютерных резервных копий. Формат файла «имя_компьютера». Поскольку я знаю, что имя компьютера статическое, мне нужно найти и взять этот каталог, чтобы я мог восстановить его содержимое.

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

REM First mount the drive that contains the backed up files
net use P: \\DC1\Shared\1Backups 

REM Get the computer's name so we know what PC backup to use.
set SaveDirectory=%computername%

REM For each folder in the directory, do this when the computer name is found. 
FOR /R "P:\" %%G in (%SaveDirectory%*) DO (
    REM Restore files
    echo found it.
    REM Copy subdirectories into User Folder
    mkdir P:\UGH
)

REM Dismount drive

Проблема с тем, что у меня есть сейчас, заключается в том, что когда я запускаю код, DO никогда не запускается. Он должен найти, что есть папка с именем "INTERN-6.21.2019", выполнив поиск "INTERN *"

Мое представление о заявлении может быть неправильным. Мне это нужно для поиска в каталоге P: /, а не во вложенных папках. Сравните имена папок с SavedDirectory, затем сделайте что-нибудь, когда они совпадут. Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 22 июня 2019

У меня обычно были хорошие результаты с использованием операторов CALL для вызова подпрограммы, а не для запуска элементов внутри ().

Хитрость в том, что вам нужно передать аргументы в подпрограмму.Как правило, вы передаете переменную (и), которую вы используете в своем выражении FOR.На них ссылаются, используя% 1 (или% 1% 2% 3, если вам нужно передать несколько вещей), потому что они действуют как аргументы командной строки.Чтобы выйти из подпрограммы, вы переходите к EOF, который затем возвращает управление в цикл FOR.После цикла FOR не забудьте перепрыгнуть подпрограмму, иначе вы ее снова выполните.В приведенном ниже примере я перехожу на: конец, но вы, безусловно, можете перейти куда-нибудь еще, чтобы сделать больше вещей.

Так что, используя эту методологию, ваш код может выглядеть так:

set SaveDirectory=%computername%

FOR /R "P:\" %%G in (%SaveDirectory%*) DO CALL :process %%G
Goto :end

:process
REM Processing goes here
goto :end

:end

Надеюсь, это поможет

0 голосов
/ 22 июня 2019

Этот ответ основан на моем понимании того, что вы пытаетесь сделать, скопировать сетевой каталог с именем computername и строкой даты (с текущей датой) в другое место :

@PushD "\\DC1\Shared\1Backups" || GoTo :EOF 
@For /F "EOL=DTokens=1-3" %%A In (
    'WMIC Path Win32_LocalTime Get Day^,Month^,Year'
)Do @For /F Tokens^=* %%D In ("%%C"
)Do @XCopy "%COMPUTERNAME%-%%B.%%A.%%D" "P:\UGH\" /H /R /K /Y>NUL 2>&1
@PopD
0 голосов
/ 22 июня 2019

Это может помочь вам.Это найдет «самый новый» каталог.Из вопроса точно не понятно, что и куда копировать.

SET "MOSTRECENT=unknown"

FOR /F "delims=" %%d IN ('DIR /B /A:D /O:D "P:\%COMPUTERNAME%*"') DO (
    SET "MOSTRECENT=%%~fd"
)

ECHO The most recent backup is "%MOSTRECENT%"

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