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

Silver Raven 14-11-2021 11:51 2971878

Некорректно работающий код (но! не у всех)
 
По результатам отзыва юзеров, получается так, что вот этот простейший кусок cmd-шника порой работает некорректно:

Код:

set "SkyrimPrefsINI=%USERPROFILE%\Documents\My Games\Skyrim Special Edition\SkyrimPrefs.ini"
set "PluginsListFolder=%USERPROFILE%\AppData\Local\Skyrim Special Edition"
 
if not exist "%SkyrimPrefsINI%" (
cls
color fc
 echo.
 echo.
 echo *ОШИБКА! SkyrimPrefs.ini не найден!
 echo.
 echo Используйте лаунчер игры для задания настроек, согласно своим предпочтениям.
 echo Перезапустите панель управления сборкой для повторного выполнения данной опции.
 echo.
 echo.
pause
exit
)
 
color f2
 @echo.
 @echo.
 @echo  ■ Копируется отсортированный список загрузки модов...
 if not exist "%PluginsListFolder%" md "%PluginsListFolder%"
 copy /y "Silver Raven mods pack data\Plugins list\plugins.txt" "%PluginsListFolder%\"
 
и т.д.

Файл по указанному пути есть - а ошибка все равно отображаетcя. Я хоть убей не могу понять, как такое может быть. cmd не запускают на ОС старее Win7. Это может быть как-то связано с тем, что имя пользователя написано на кириллице?

Elven 14-11-2021 13:57 2971888

Цитата:

Цитата Silver Raven
Код:

set "SkyrimPrefsINI=%USERPROFILE%\Documents\My Games\Skyrim Special Edition\SkyrimPrefs.ini"
»

есть пробелы в пути, значит нужно заковычивать. и заковычиывать не вместе с переменной, а именно значение.
Код:

set SkyrimPrefsINI="%USERPROFILE%\Documents\My Games\Skyrim Special Edition\SkyrimPrefs.ini"
Дальше аналогично, т.к. скрипт не весь, то не вижу смысла подробнее вычитывать то, про что не спрошено.

Silver Raven 14-11-2021 14:55 2971896

Elven
Цитата:

Цитата Elven
есть пробелы в пути, значит нужно заковычивать. и заковычиывать не вместе с переменной, а именно значение. »

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

Iska 14-11-2021 15:22 2971897

Цитата:

Цитата Elven
есть пробелы в пути, значит нужно заковычивать. и заковычиывать не вместе с переменной, а именно значение. »

Не надо. Кавычки должны быть в месте раскрытия переменной окружения, а не в месте присваивания пути. В приведённом коде именно так и сделано.

Цитата:

Цитата Silver Raven
Код:

set "PluginsListFolder=%USERPROFILE%\AppData\Local\Skyrim Special Edition"
»

Имеет смысл использовать:
Код:

set "PluginsListFolder=%LOCALAPPDATA%\Skyrim Special Edition"


Цитата:

Цитата Silver Raven
Файл по указанному пути есть - а ошибка все равно отображаетcя. »

Какая именно ошибка? Попросите прислать скриншот.

Silver Raven 14-11-2021 18:55 2971914

Iska
Пока, высланные скриншоты ничего конкретного мне не говорят:

https://ibb.co/60Qd56N - попросил убрать @echo off
https://ibb.co/qmZxK98 - описанная мной ошибка

Опишу cmd-шник подробнее:

При запуске проверяется наличие переменной FirstLaunch = true (хранится во внешнем .cfg)
после чего запускается определенный набор действий

Код:

set "TempConfig=Silver Raven mods pack data\temp_config.tmp"
set "MainConfig=Silver Raven mods pack data\main_config.cfg"
set "HDAudioConfig=Silver Raven mods pack data\hd_audio_config.cfg"
set "ControlPanelFilesList=Silver Raven mods pack data\control_panel_files_list.cfg"

set "ModsPackRussianLocalizationFolder=Silver Raven mods pack data\Additional options\Mods pack russian localization"
set "SkyrimPrefsINI=%USERPROFILE%\Documents\My Games\Skyrim Special Edition\SkyrimPrefs.ini"
set "SkyrimINIFolder=%USERPROFILE%\Documents\My Games\Skyrim Special Edition"
set "PluginsListFolder=%USERPROFILE%\AppData\Local\Skyrim Special Edition"

if "%FirstLaunch%" == "true" (
color f2
 echo.
 echo  ╔══════════════════════════════════════════╗
 echo  ║ Панель управления Silver Raven mods pack ║
 echo  ║      РЕЖИМ ПЕРВОНАЧАЛЬНОЙ НАСТРОЙКИ      ║
 echo  ╚══════════════════════════════════════════╝
 echo.
 echo.
 echo  ■ Копируются файлы русскоязычной локализации модификаций сборки...
 xcopy "%ModsPackRussianLocalizationFolder%" "Data\" /y /e /q
 echo.
 echo.
timeout /t 3
call :option_1_copy_plugins_list_and_ini_settings
)

*здесь другой код, который в момент работы с переменной FirstLaunch - не активен*

:option_1_copy_plugins_list_and_ini_settings
cls
if not exist "%SkyrimPrefsINI%" (
cls
color fc
 echo.
 echo.
 echo *ОШИБКА! SkyrimPrefs.ini не найден!
 echo.
 echo Используйте лаунчер игры для задания настроек, согласно своим предпочтениям.
 echo Перезапустите панель управления сборкой для повторного выполнения данной опции.
 echo.
 echo.
pause
exit
)

color f2
 @echo.
 @echo.
 @echo  ■ Копируется отсортированный список загрузки модов...
 if not exist "%PluginsListFolder%" md "%PluginsListFolder%"
 copy /y "Silver Raven mods pack data\Plugins list\plugins.txt" "%PluginsListFolder%\"

 @echo.
 @echo.
 echo  ■ Редактируется SkyrimPrefs.ini...
)

*далее простыня кода, который тут, наверняка, не чем не поможет*



Многие получают мое заготовленное сообщение о том, что файл SkyrimPrefs.ini не найден, хотя, на самом деле он присутствует по указанному пути. Из-за того, что более-менее подробные данные о ОС дал только один человек, я знаю что у него Win10 x64 и имя профиля написано кириллицей.

Petya V4sechkin 14-11-2021 20:39 2971930

Цитата:

Цитата Silver Raven
xcopy "%ModsPackRussianLocalizationFolder%" "Data\" /y /e /q

Для диагностики замените опцию /q на /f и попросите прислать результат.

P.S. Могу только предположить, что дело в относительных путях (зависит от способа запуска вашего cmd-файла).

Elven 14-11-2021 20:51 2971932

Цитата:

Цитата Silver Raven
файл SkyrimPrefs.ini не найден, хотя, на самом деле он присутствует по указанному пути »

Было бы здорово проверить существование файла еще одним способом, например через dir:
Код:

dir %SkyrimPrefsINI% && echo "exist" || echo "not exist"
Ровно как и проверить существование папок/подпапок в которых он должен находиться.
Ну и значение %USERPROFILE% не помешает проверить.

Foreigner 14-11-2021 21:01 2971933

Цитата:

Цитата Silver Raven
файл SkyrimPrefs.ini не найден »

Значит его по этому пути нет. Учетная запись на 10-ке может быть online, Майкрософт, тогда Documents находятся в OneDrive. И как там с локализацией, не "Документы" случайно?

Silver Raven 14-11-2021 21:50 2971935

Первый (и последующие) запуски происходят по окончанию распаковки на ПК юзера, вот как-то отсюда: https://imgbb.com/fGDXJVV (опять же пример c проблемного ПК)
cmd-шник проверяет наличие SkyrimSE.exe и набора файлов в Silver Raven mods pack data перед началом работы.

Foreigner
Цитата:

Цитата Foreigner
Учетная запись на 10-ке может быть online, Майкрософт, тогда Documents находятся в OneDrive.»

Узнаю у юзеров. Но по идее все должно перенаправляться в облако само? (а-ля mklink) Программы же как-то ставят свои файлы в папки юзера.

Вот еще отзыв: "лаунчер запускал. SkyrimPrefs.ini лежит по адресу Пользователи/dmitr/Документы/My Games/Skyrim Special Edition.
OC 64-битная Windows10, имя пользователя написано латиницей."


P.S. Могу дать полный cmd-шник и все файлы к нему, если кто-то захочет познакомиться с чудовищем поближе.

Silver Raven 14-11-2021 22:17 2971938

Вот, еще подсказали, запросить расположение папки документов юзера такой командой:
Код:

for /f "tokens=3" %I in (' reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Personal" 2^>nul ') do echo. User Documents: "%I"

Silver Raven 19-11-2021 14:06 2972508

Оказывается, ключ реестра Shell Folders - плохой вариант. Не делайте так.
Вот почему: Длинная и печальная история ключа Shell Folders

Решение - использовать Ms JScript:

Код:

@set @A=0/*&echo off
// Узнаем расположение папок пользователя, через Microsoft JScript
@for /f "tokens=1,2 delims=*" %%A in ('cscript /e:jscript %0') do (
  set "UserDataFolder=%%A\My Games\Skyrim Special Edition"
  set "PluginsListFolder=%%B\Skyrim Special Edition"
)

:: Здесь мой код

*/with(WSH.CreateObject('Shell.Application')){WSH.echo(namespace(5).self.path+'*'+namespace(28).self.path)}


Iska 19-11-2021 23:21 2972552

Silver Raven, не «плохой». Нежелательный. Проблема в том, что в пакетных файлах неоткуда брать пути, кроме как из реестра и через задницу. Попросту нет выбора. Так-то можно не извращаться и хоть mshta.exe «прикрутить» вместо гибрида.


Время: 04:04.

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