Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   поиск файла. (http://forum.oszone.net/showthread.php?t=183864)

rust-02 26-08-2010 00:00 1481809

поиск файла.
 
нужно чтобы batник искал файл 123456.exe на диске С.
как это написать?

deepred 26-08-2010 01:10 1481826

rust-02,

Код:

DIR /b/s/a-d C:\123456.exe
или
Where /r C:\ 123456.exe

для записи пути в переменную
for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\hosts') Do Set $Path=%%a

Две первые командные строки выдадут Вам полный путь до искомого файла, третья
запишет путь к найденному файлу в переменную $Path

PS: Дальнейшие действия не предполагаются?

rust-02 26-08-2010 10:01 1481978

если кто знает,как можно этот путь передать в delphi?

deepred 26-08-2010 11:39 1482043

rust-02,

А зачем? В DELPHI есть собственная функция поиска файлов: function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec):

В Вашем случае будет что-то в таком духе:

Код:

findFirst('C:\','123456.exe',faAnyFile,sr)

если нужна форма, то примерно так:
procedure TForm1.Button1Click(Sender: TObject);
var sr:TSearchRec;
begin
findFirst('C:\','123456.exe',faAnyFile,sr)
edit1.Text:=sr.Name;
end;

выполнить в cmd можно так
uses ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShellExecute(0,'open','cmd.exe','/k Where /r C:\ 123456.exe','C:\Windows\system32\',SW_SHOW);
end;

PPS: рекомендую Вам этот форум: DELPHI и этот форум: DELPHISOURCES.RU

Aarons 04-03-2011 01:41 1626858

Подскажите пожалуйста. Я вот сделал таким образом поиск файла :
Код:

@echo on  DIR /b/s/a-d D:\login.ini  pause
Как мне теперь содержимое найденого файла вывести на экран ?

Iska 04-03-2011 06:48 1626905

Aarons, смотрите выше сообщение deepred'а:
Код:

for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\hosts') Do Set $Path=%%a
У Вас будет аналогично — поиск, разбор, вывод [не проверялось]:
Код:

for /f "tokens=*" %%a in ('Dir /b/s/a-d D:\login.ini') Do type "%%a"

Aarons 04-03-2011 19:53 1627355

Ну вот, я сделал так :
for /f "tokens=*" %%a in ('Dir /b/s/a-d D:\login.ini') Do Set name=%%a
Файл находит. Теперь именно полное содержимое файла нужно занести в другую переменную.
Как это сделать ? )

Iska 05-03-2011 07:12 1627573

Цитата:

Цитата Aarons
Как мне теперь содержимое найденого файла вывести на экран ? »

Цитата:

Цитата Aarons
Теперь именно полное содержимое файла нужно занести в другую переменную. Как это сделать ? »

Так что же всё-таки Вам нужно??? И зачем Вам нужно содержимое файла в переменной? Что будете делать дальше?

Aarons 05-03-2011 14:59 1627864

С выводом на экран разобрался, нужно теперь полностью содержимое файла в переменную.

В каком плане "зачем" ? Если попросил помощи - значит для чего то да и нужно.
Для быстрой работы мне нужно, чтоб нужный мне файл на кампьютере искался и выводился на экран его содержимое.
Но для этого я хочу это содержимое в переменную.

Iska 05-03-2011 18:56 1628068

Цитата:

Цитата Aarons
В каком плане "зачем" ? Если попросил помощи - значит для чего то да и нужно. »

С таким подходом — ждите, пока кто другой ответит. Дело Ваше. Я же не вижу смысла что-то делать, не видя конечной цели.

Aarons 05-03-2011 22:12 1628228

Внизу я подписывал для чего. Конечная цель вроде и так понятна. Найти файл, поместить его содержимое в переменную и вывести на экран.

Разве это так не понятно ?

Iska 06-03-2011 05:23 1628341

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

amel27 06-03-2011 05:54 1628343

Цитата:

Цитата Aarons
Найти файл, поместить его содержимое в переменную и вывести на экран. »

Код:

@echo off
SETLOCAL EnableDelayedExpansion
::поиск файла
for /f "tokens=*" %%a in ('dir /b/s/a-d "D:\login.ini"') do set "name=%%a"
::чтение в "переменную" $v_
for /f %%a in ('^<"%name%" find/c /v ""') do set/a "$n=%%a"
for /f "tokens=1* delims=:" %%a in ('findstr/n $ "%name%"') do set "$v_%%a=%%b "
::вывод на экран из памяти
(echo %name%
 echo ---------------------
 for /l %%i in (1,1,%$n%) do @call echo\%%$v_%%i:~,-1%%
)|more

echo\&pause

- строка файла не должна начинаться на двоеточие ":"
- строки не должны содержать восклицательных знаков "!" и спецсимволов
- при желании можно учесть и эти случаи ценой усложнения скрипта

amel27 06-03-2011 06:47 1628346

Цитата:

Цитата Aarons
Конечная цель вроде и так понятна. »

Формально Iska прав: вывод файла на экран (пользователю) - "цель", предварительное сохранение данных в переменной (программером) - "средство". "Цель" всегда одна, "средств" - множество, вплоть до самых извращенных... типа "вывести именно батником" (шутка).

"средство" может стать "целью":

- в академических целях (задача из учебника);
- из-за дополнительных ограничений (политика безопасности, знание языка, особенности реализации и т.п.);

Все эти факторы крайне желательно оговаривать при постановке задачи.

Aarons 07-03-2011 02:46 1629080

Уважаемые Господа, а подскажите - как добавить в переменную из файла к примеру только первую и четвёртую строки. Другие пропустить.

Прошу прощения за надоедливость.

Merlin1975 19-02-2012 22:31 1862314

А можно ли написать батник, чтобы он искал определенный файл и подменял его другим?

Iska 19-02-2012 22:46 1862333

Цитата:

Цитата Merlin1975
А можно ли написать батник, »

Можно.

Цитата:

Цитата Merlin1975
чтобы он искал определенный файл »

Код наличествует в данной теме.

Цитата:

Цитата Merlin1975
и подменял его другим? »

Поясните.

Anonymоus 19-02-2012 23:19 1862366

Aarons, вот так:
Код:

@Echo Off
SetLocal EnableDelayedExpansion
:: Здесь указываем номера нужных строк
Set Strings=[1],[4]
Set i=0
For /F "usebackq delims=" %%A In ("C:\Documents and Settings\Inquisitor\Рабочий стол\Новая папка\config.pl") Do (
Set /A i+=1
Echo %Strings%|Find "[!i!]">nul && Set Result=!Result!%%A
)
Echo %Result%
Pause

Номера добавляемых строк пишутся в переменную Strings, в квадратных скобках, через запятую (последнее необязательно, исключительно для более аккуратной записи), результат в виде общего содержимого всех выбранных строк пишется в переменную Result. Например, если протестировать на файле с вот таким содержимым
Код:

one
two
three
four
five

То в Result окажется строка onefour

Iska 20-02-2012 01:42 1862446

Anonymоus, если коллега Aarons не подписан на эту тему, то вряд ли он узнает о решении: скоро год как он не заходил на форум.

keda 28-03-2012 14:39 1888546

подскажите как реализовать такой батник ?

1 искать файл 1.exe по локальным дискам (может быть несколько)
2 если 1.exe найден по запускаем приложение A.exe от имени администратора, если ненайден то переходим к поиску файла 2.exe

Mikhail_R 13-03-2013 14:14 2110244

Ребята помогите пожалуйста!
Следующая задача: 1. Найти значение в реестре (переменная среды) и если она существует, то запустить Google Chrome
2. Если ее нет, то найти exe-шник google chrome и записать его путь в значение переменной, чтобы обращаться к ней для последующего запуска хрома

Все это необходимо для запуска хрома с определенными параметрами!

вот код, который работает на некоторых компах, а на некоторых нет

@echo off
rmdir c:\GoogleChrome\ERK_Cache\ /s /q
mkdir c:\GoogleChrome\ERK_Cache\
set errorlevel=0
For /F "Tokens=2*" %%I In ('Reg Query "HKCU\Environment" /V PATH_CHROME') Do Set PATH_CHROME=%%I
if %PATH_CHROME% == REG.EXE goto RegAdding
cd %PATH_CHROME%
start chrome.exe --disk-cache-size=274258963 --app= --disk-cache-dir="c:\GoogleChrome\Cache"
goto end
:RegAdding
set PATH_CHROME=
for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\chrome.exe') do set PATH_CHROME=%%a
reg add HKCU\Environment /v PATH_CHROME /t REG_SZ /d "%PATH_CHROME%" /f
cd %PATH_CHROME%
start chrome.exe --disk-cache-size=274258963 --app= --disk-cache-dir="c:\GoogleChrome\Cache"
:end


PS.: если будут идеи как легче или лучше организовать, буду всеми руками и ногами за них, спасибо!!!

Добрый день!

Необходимо найти exe файл и добавить в переменную значение пути к нем


данный код добавляет и chrome.exe в значение переменной, что выдает ошибку при дальнейшем запуске, как убрать это оттуда

for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\chrome.exe') do set PATH_CHROME=%%a

Спасибо!

for /f "tokens=*" %%a in ('Dir/b/s/a-d C:\chrome.exe') do set PATH_CHROME=%%a

Находит файл, но записывает к нему в в конце c:\Documents and Settings\.....\chrome.exe, как убрать, т.к. не находит правильный путь

Kryptonite 25-10-2013 15:02 2240937

Продолжая тему. нужно дописать в конфиг файл в юзерской папке несколько строк (настройка адресной книги из AD в thunderbird-е)
соответственно файл лежит в папке вида C:\Users\current_user\AppData\Roaming\Thunderbird\Profiles\kcab2bup.default
так как юзеров на машине с профилем TB может быть несколько, то просто поиск по C:\Users выдаст несколько файлов

собственно вопросы-
как искать в папке текущего пользователя? +скрипт будет запускаться вероятно от системы/админа- мб это как-то помешает?

дальше for /f "tokens=*" %%a in ('Dir /b/s/a-d C:\hosts') Do Set $Path=%%a путь задается в переменную- тут все без изменений?

собственно запись в файл echo "text" >> c:\somefile.txt - как указать здесь переменную пути?

amel27 25-10-2013 15:25 2240947

Kryptonite,

1. по своему смыслу, "текущий" = "под которым запущен скрипт"
может быть одновременно >1 залогиненного пользователя (удаленно, планировщик и т.п.)

2. код ищет все файлы "hosts" на диске C: , именно это и нужно?.. еще вариант:
Код:

for /f "tokens=*" %%a in ('dir /b/s/a-d c:\users\hosts') do (
  set "$Path=%%a"
  call echo %%$Path%%
)

3. Один из способов приведен в п.2

Kryptonite 25-10-2013 15:55 2240961

касательно пользователя - при логине запускается скрипт (спс групповым политикам) (в ад есть строка параметры сценария- мб там можно указать именно запуск от логинившегося юзера, еще не смотрел что/как).
Соответственно на компе есть N учеток, надо чтобы в CMD указывался current_user- тот кто залогинился. Например по дате последнего вызова, из таскменеджера- не знаю как, экспы мало.
Соответственно команда на поиск pref.js именно в папке этого пользователя

про запись в файл не понял
Where /r C:\ 1.js
for /f "tokens=*" %%a in ('dir /b/s/a-d c:\users\hosts') do (
set "$Path=%%a"
call echo %%$Path%%
)
Echo user_pref("ldap_2.autoComplete.directoryServer", "ldap_2.servers.pl1_1"); >> - как здесь конец выглядит?

amel27 25-10-2013 16:22 2240971

Цитата:

Цитата Kryptonite
как здесь конец выглядит? »

а что "здесь" скрипт должен делать?.. пример, если что, нерабочий
пример поиска pref.js в профиле текущего пользователя и вывод пути в файл C:\LOGS\User.log:
Код:

@echo off
set "LogPath=C:\LOGS\"
if not exist %LogPath% md %LogPath%
(
for /f "delims=" %%a in ('dir /b/s/a-d c:\users\%UserName%\pref.js') do echo %%a
)>%LogPath%\%UserName%.log

З.Ы. у пользователя должны быть права на запись целевую в папку

Гуллипут 26-10-2013 23:40 2241655

Если в файле больше одной строки - то никак не занести его в переменную.
С одной строкой так:
Код:

for /F "delims=" %%s in (file) do set var=%%s

Kryptonite 28-10-2013 08:26 2242310

Цитата:

Цитата amel27
а что "здесь" скрипт должен делать? »

запись в файл текста, после ">>" указывается путь. (C:\1.js например)

Есть еще вариант не поиска текущего пользователя, а поиска последнего измененного prefs.js
тогда нужно поиск по C:\Users и найти самый новый
блин, еще у огнелиса такое же имя файла есть...........

Kryptonite 28-10-2013 11:43 2242408

проблема решилась без костылей. в C:\Program Files (x86)\Mozilla Thunderbird\defaults\pref можно указать конфиг файл, с которого брать доп настройки и собственно написать еще один конфиг файл с нужными строками
благодарю всех за участие!

SharkyEXE 23-02-2022 21:36 2980705

Всем здравствуйте

Пожалуйста, помогите, хочется чем проще, тем лучше - как для понимания (немного въехать, понять, что и как), так и для реализации

Требуется найти файл 1.exe на диске C:\, включая неограниченную глубину подпапок, путь к файлу может содержать как пробелы, так и русские названия папок

Когда файл 1.exe найдется, требуется записать в переменную full_path полный путь к файлу, включая расширение, например, если файл 1.exe найдется в папке C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup, то в переменной full_path должно быть прописано C:\Users\Администратор\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\1.exe

Спасибо.

megaloman 24-02-2022 15:15 2980744

SharkyEXE, Если Вы уверены, что искомый файл один, то:
Код:

@Echo Off
cls
        Set "BoxIn=D:"
        Set "FFile=я22022410.bat"


        FOR /F "usebackq delims=" %%f In (`2^>nul Where /R "%BoxIn%" "%FFile%"`) DO Set "full_path=%%f"
        Echo full_path= "%full_path%"
Pause
Exit /B

При этом в переменной полУчите последний найденный.

Если файлов может быть несколько, то:
Код:

@Echo Off
cls
        Set "BoxIn=D:"
        Set "FFile=я22022410.bat"


        Set /A N=0
        FOR /F "usebackq delims=" %%f In (`2^>nul Where /R "%BoxIn%" "%FFile%"`) DO (
                Set /A N+=1
                Call Set "full_path_%%N%%=%%f"
        )
        Set "full_path_"
Pause
Exit /B

При этом полУчите список пронумерованных переменных.
Пути и имя файла укажите свои.
Цитата:

Цитата SharkyEXE
путь к файлу может содержать как пробелы, так и русские названия папок »

Сохраните батник в 866 кодировке.
Если Вы работаете с блокнотом (кодировка 1251) то после cls добавьте строку
Код:

@Echo Off
cls
>nul Chcp 1251


Гуллипут 26-02-2022 08:25 2980834

Цитата:

Цитата SharkyEXE (Сообщение 2980705)
Всем здравствуйте

Пожалуйста, помогите, хочется чем проще, тем лучше - как для понимания (немного въехать, понять, что и как), так и для реализации

Требуется найти файл 1.exe на диске C:\, включая неограниченную глубину подпапок, путь к файлу может содержать как пробелы, так и русские названия папок

Когда файл 1.exe найдется, требуется записать в переменную full_path полный путь к файлу, включая расширение, например, если файл 1.exe найдется в папке C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup, то в переменной full_path должно быть прописано C:\Users\Администратор\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\1.exe

Спасибо.

cd /d C:
for /R %%f in (1.exe) do if exist "%%f" set full_path=%%f
echo full_path=%full_path%

Так в переменной окажется путь к последнему из всех найденных файлов 1.exe.

Если нужна информация обо всех найденных файлах, то можно вывести её в ходе поиска в файл:


cd /d C:
copy nul found.txt
for /R %%f in (1.exe) do if exist "%%f" (
set full_path=%%f
>>found.txt echo %%f
)
echo full_path=%full_path%
pause
more found.txt


Время: 11:04.

Время: 11:04.
© OSzone.net 2001-