Компьютерный форум 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=292310)

4ITEP 09-12-2014 10:18 2441632

батник для хардлинка файлов/соединений для папок
 
Есть такая игрушка - CS: Source. Вот там есть разные режими, интернет у меня не очень, приходится играть локально. Хочу сделать себе несколько серверов разных типов, для економии размера решил сделать батник для хардлинка файлов/соединений для папок. Подскажите, где ошибка!
Код:

@echo off
set /p new="Enter you path for new CSS: > "
set /p old="Enter you path for old CSS: > "
md "%new%" "%new%\cstrike" "%new%\config"
set cstrike="%new%\cstrike"
set old_cstrike="%old%\cstrike"
mklink /j "%new%\bin" "%old%\bin"
mklink /j "%new%\hl2" "%old%\hl2"
mklink /j "%new%\platform" "%old%\platform"
mklink /j "%new%\Steam" "%old%\Steam"
xcopy "%old%\config" "%new%\config" /C /I /L /H /K /R /Y
for "%old%\%%A" IN (*.exe *.dll steam_appid.txt) DO (fsutil hardlink create "%new%\%%~A" "%old%\%%A")
xcopy "%old%\rev.ini" "%new%\rev.ini"
cd "%cstrike%"
md addons bin cfg custom maps materials resource sound
for "%old_cstrike%\addons\%%B" IN (Name_Enabler.dll Name_Enabler.vdf) DO (fsutil hardlink create "%cstrike%\addons\%%~B" "%%~B")
for "%old_cstrike%\bin\%%C" IN (client.dll server.dll) DO (fsutil hardlink create "%cstrike%\bin\%%~C" "%%~C")
for "%old_cstrike%\resource\%%D" IN (*.ttf *.txt) DO (fsutil hardlink create "%cstrike%\recource\%%~D" "%%~D")
mklink /j "%cstrike%\cache" "%old_cstrike%\cache"
mklink /j "%cstrike%\download" "%old_cstrike%\download"
mklink /j "%cstrike%\downloadlists" "%old_cstrike%\downloadlists"
mklink /j "%cstrike%\media" "%old_cstrike%\media"
mklink /j "%cstrike%\models" "%old_cstrike%\models"
mklink /j "%cstrike%\sound" "%old_cstrike%\sound"
xcopy "%old_cstrike%\cfg" "%cstrike%\cfg" /L /H /K
xcopy "%old_cstrike%\custom" "%cstrike%\custom" /L /H /K
xcopy "%old_cstrike%\materials" "%cstrike%\materials" /L /H /K
xcopy "%old_cstrike%\resource" "%cstrike%\resousce" /L /H /K

for "%old_cstrike%\resource\%%E" IN (*.vpk steam.inf) DO (fsutil hardlink create "%cstrike%\recource\%%~E" "%%~E")
for "%old_cstrike%\%%F" IN (*.txt *.vdf) DO (xcopy "%%~F" "%cstrike%\recource\%%~F" /L /H /K)
echo Completed
pause


4ITEP 09-12-2014 10:30 2441640

P.S. команда
Код:

for "%old%\%%A" IN (*.exe *.dll steam_appid.txt) DO (fsutil hardlink create "%new%\%%~A" "%old%\%%A")
должна найти файлы в папке %old%\ по маске *.exe *.dll steam_appid.txt и сделать хардлинк найденных файлов в %new%\ . По моему, в батнике ошибке именно в етой команде.

4ITEP 09-12-2014 20:26 2441952

Не работает. Батник вылетает с надписью:
Цитата:

Непредвиденное появление: IN.

Georgio 09-12-2014 22:12 2442001

Код:

for /r "%old%" %%A in (*.exe *.dll steam_appid.txt) do fsutil hardlink create "%new%\%%~nxA" "%%A"

4ITEP 10-12-2014 20:00 2442439

А если использовать ее несколько раз, то A надо оставлять, или в каждой новой команде надо менять букву?

Georgio 10-12-2014 20:48 2442472

Букву оставляйте, только остальное менять не забывайте.

4ITEP 11-12-2014 14:08 2442784

Вложений: 1
Работает с ошибками. Новая версия батника:
Код:

set /p new="Enter you path for new CSS: > "
set /p old="Enter you path for old CSS: > "
md "%new%" "%new%\cstrike" "%new%\config"
cd "%new%"
set cstrike="%new%\cstrike"
set old_cstrike="%old%\cstrike"
mklink /j "%new%\bin" "%old%\bin"
mklink /j "%new%\hl2" "%old%\hl2"
mklink /j "%new%\platform" "%old%\platform"
mklink /j "%new%\Steam" "%old%\Steam"
xcopy "%old%\config" "%new%\config" /L /H /K /R
for /r "%old%" %%A in (*.exe *.dll steam_appid.txt) do fsutil hardlink create "%new%\%%~nxA" "%%A"
copy "%old%\rev.ini" "%new%\rev.ini"
cd "%cstrike%"
md addons bin cfg custom maps materials resource sound
for /r "%old_cstrike%\addons" %%A in (Name_Enabler.dll Name_Enabler.vdf) do fsutil hardlink create "%cstrike%\addons\%%~nxA" "%%A"
for /r "%old_cstrike%\bin" %%A in (client.dll server.dll) do fsutil hardlink create "%cstrike%\bin\%%~nxA" "%%A"
for /r "%old_cstrike%\resource" %%A in (*.ttf *.txt) do fsutil hardlink create "%cstrike%\recource\%%~nxA" "%%A"
mklink /j "%cstrike%\cache" "%old_cstrike%\cache"
mklink /j "%cstrike%\download" "%old_cstrike%\download"
mklink /j "%cstrike%\downloadlists" "%old_cstrike%\downloadlists"
mklink /j "%cstrike%\media" "%old_cstrike%\media"
mklink /j "%cstrike%\models" "%old_cstrike%\models"
mklink /j "%cstrike%\sound" "%old_cstrike%\sound"
xcopy "%old_cstrike%\cfg" "%cstrike%\cfg" /L /H /K
xcopy "%old_cstrike%\custom" "%cstrike%\custom" /L /H /K
xcopy "%old_cstrike%\materials" "%cstrike%\materials" /L /H /K
xcopy "%old_cstrike%\resource" "%cstrike%\resousce" /L /H /K
for /r "%old_cstrike%\resource" %%A in (*.vpk steam.inf) do fsutil hardlink create "%cstrike%\recource\%%~nxA" "%%A"
for /r %old_cstrike% %%A in (*.txt *.vdf) do xcopy %cstrike%\%%~nxA "%%A"
echo Completed
pause

Лог прикреплен

4ITEP 11-12-2014 14:14 2442790

команда
Код:

for /r "%old%" %%A in (*.exe *.dll steam_appid.txt) do fsutil hardlink create "%new%\%%~nxA" "%%A"
ищет файлы в подпапках. Мне ето не нужно. Как запретить ей это делать?

Georgio 11-12-2014 22:27 2442975

Цитата:

Цитата 4ITEP
Работает с ошибками. »

Цитата:

Ошибка: Не удается найти указанный файл.


Это не ошибка работы пакетного файла. Это нормальная ошибка выполнения отдельной команды: искомый файл ("steam_appid.txt") отсутствует в данной директории. Чтобы не усложнять код конструкциями
Код:

<...> in ('2^>nul dir /a-d/b <...>') do <...>
,
или
Код:

<...> do if exist <...> fsutil <...>
,
или
Код:

2>nul (for <...............>)
просто не обращайте на эти ошибки внимания или добавьте в код звёздочку (что не совсем корректно, но для Вашего случая, думаю, сгодится):
Код:

steam_appid.txt*
.




Цитата:

Цитата 4ITEP
команда
Код:

for /r "%old%" %%A in (*.exe *.dll steam_appid.txt) do fsutil hardlink create "%new%\%%~nxA" "%%A"
ищет файлы в подпапках. Мне ето не нужно. Как запретить ей это делать? »



Попробуйте так:

Код:

pushd "%old%"
for %%A in (*.exe *.dll steam_appid.txt*) do popd& pushd "%new%"& fsutil hardlink create "%%A" "%%~fA"
popd

.

4ITEP 12-12-2014 07:16 2443042

А если использовать несколько раз? Не нужно ничего менять (кроме маски и пути)?

Georgio 12-12-2014 23:12 2443327

Цитата:

Цитата 4ITEP
А если использовать несколько раз? Не нужно ничего менять (кроме маски и пути)? »



В коде
Код:

pushd "%old%"
for %%A in (*.exe *.dll steam_appid.txt*) do popd& pushd "%new%"& fsutil hardlink create "%%A" "%%~fA"
popd

можно менять только выделенное красным цветом.


Если в качестве значений переменных "old" и "new" Вы вводите только полные имена папок, например,
Код:

C:\123\321
,
а не часть полного имени (относительно расположения пакетного файла), то код можно сократить:
Код:

pushd "%old%"
for %%A in (*.exe *.dll steam_appid.txt*) do do fsutil hardlink create "%new%\%%A" "%%A"
popd

.
Также можно менять только выделенное красным цветом.




Цитата:

Цитата 4ITEP
Код:

set cstrike="%new%\cstrike"
set old_cstrike="%old%\cstrike"

»



Правильно присваивать значения переменным в Вашем случае надо так:
Код:

set "cstrike=%new%\cstrike"
set "old_cstrike=%old%\cstrike"

,
иначе у Вас при раскрытие переменных появляются лишние кавычки в путях.


Время: 17:51.

Время: 17:51.
© OSzone.net 2001-