Возникли проблемы с работой текстового файла со специальными символами в программе .bat - PullRequest
0 голосов
/ 23 сентября 2018

Вопрос переформатирован, теперь эта причина ошибки найдена.

Справочная информация: Так что я довольно новичок в .bat, поэтому любые общие рекомендации по моему коду были бы хорошими.На флешке я запускаю простую программу, которая зашифрует содержимое другого файла на моей флешке.Эти файлы могут содержать любые символы клавиатуры, поэтому мне нужно иметь возможность обрабатывать все из них.

Ошибка: Похоже, что хотя я использую delayedExpansinon, моя программа по-прежнему не может обработать ядперсонажи.Моя программа не перебирает много строк (спасибо michael_heath), однако в следующем журнале ошибок показана новая ошибка.Похоже, что «все еще проблема. Также в ходе тестирования я обнаружил, что он не работает с% или! В abet и cipher1.

ПРИМЕЧАНИЕ. Чтобы исправить это, я попытался добавить enabledealyedexpansion ко всей функциональности encrypt / dycrpt.Это исключило мою ошибку, связанную с "но мой код не обрабатывает% и!больше.

Программа

@echo off
setlocal
cd BatchMenu/BatchLibs
set "command=%3"
set "drivePath=%2"
set "fileName=%1"

set "abet=abcdefghijklmnopqrstuvwxyz!@# $%^&*()_-+={[}]/?<,>.\|~`':; 0123456789"
set "cipher1=;~`8p#j4*&9z\6w+}.{a@%^e?[@0u2< r|5)o!(xk_-[cf'1b3g7h=m>,qil/sntdvy:"
if "%command%" == "d" goto dycrypt
goto encrypt

:encrypt
(
    for /f "usebackq delims=" %%A in ("%drivePath%%fileName%.txt") do (
        setlocal enabledelayedexpansion
        set "line=%%~A"
        call :encipher
        endlocal
    )
) 3> "%drivePath%%fileName%temp.txt"

if exist "%drivePath%%fileName%.txt" ren "%drivePath%%fileName%.txt" "%fileName%.bak"
ren "%drivePath%%fileName%temp.txt" "%fileName%.txt"
del "%drivePath%%fileName%.bak"
goto :eof

:dycrypt
(
    for /f "usebackq delims=" %%A in ("%drivePath%%fileName%.txt") do (
        setlocal enabledelayedexpansion
        set "line=%%~A"
        call :decipher
        endlocal
    )
) 3> "%drivePath%%fileName%temp.txt"

if exist "%drivePath%%fileName%.txt" ren "%drivePath%%fileName%.txt" "%fileName%.bak"
ren "%drivePath%%fileName%temp.txt" "%fileName%.txt"
del "%drivePath%%fileName%.bak"
goto :eof

:decipher
set "morf=%abet%"
set "from=%cipher1%"
goto trans

:encipher
set "from=%abet%"
set "morf=%cipher1%"

:trans
set "enil="

:transl
set "$1=%from%"
set "$2=%morf%"

:transc
if /i "!line:~0,1!" == "!$1:~0,1!" (
set "enil=%enil%%$2:~0,1%"
goto transnc
)
set "$1=%$1:~1%"
set "$2=%$2:~1%"

IF defined $2 goto transc
:: No translation - keep
set "enil=%enil%%line:~0,1%"

:transnc
set "line=!line:~1!"
if defined line goto transl

if defined enil >&3 echo !enil!
goto :eof

Журнал ошибок

E:\BatchMenu\BatchLibs>set "$1=rstuvwxyz@# $; 0123456789" 

E:\BatchMenu\BatchLibs>set "$2=.{a@" 

E:\BatchMenu\BatchLibs>IF defined $2 goto transc 

E:\BatchMenu\BatchLibs>if /I "|" == "r" (
set "enil=1|`:\@{p.{\;w;.8zww\8ww6zw;8{\*6a.w aw .4paw.*` ;68 pa4w{.++ax|`:\@{p.{\;w;.8zww\8ww6zw;8{\*6a.w aw .4paw.*` ;68 pa4w{.++ax|13101368703482566|805152|805152|1|0|0|13101368703615493|1|4aa+{://`w@.{p{.{`4wwz.p8@/wp~;++{/~z;`9~w;.8/pxp`@ap/8*{+z;y*68*v*8@;z`w6ap6a?\w8p=v*pw&`w6ap6a_*8=_1553882_1&`w@.{p_*8=_75015_1||."  
 goto transnc 
) 

E:\BatchMenu\BatchLibs>set "$1=stuvwxyz@# $; 0123456789" 

E:\BatchMenu\BatchLibs>set "$2={a@" 

E:\BatchMenu\BatchLibs>IF defined $2 goto transc 

E:\BatchMenu\BatchLibs>if /I "|" == "s" (
set "enil=1|`:\@{p.{\;w;.8zww\8ww6zw;8{\*6a.w aw .4paw.*` ;68 pa4w{.++ax|`:\@{p.{\;w;.8zww\8ww6zw;8{\*6a.w aw .4paw.*` ;68 pa4w{.++ax|13101368703482566|805152|805152|1|0|0|13101368703615493|1|4aa+{://`w@.{p{.{`4wwz.p8@/wp~;++{/~z;`9~w;.8/pxp`@ap/8*{+z;y*68*v*8@;z`w6ap6a?\w8p=v*pw&`w6ap6a_*8=_1553882_1&`w@.{p_*8=_75015_1||{"  
 goto transnc 
) 

E:\BatchMenu\BatchLibs>set "$1=tuvwxyz@# $; 0123456789" 

E:\BatchMenu\BatchLibs>set "$2=a@" 

E:\BatchMenu\BatchLibs>IF defined $2 goto transc 

E:\BatchMenu\BatchLibs>if /I "|" == "t" (
set "enil=1|`:\@{p.{\;w;.8zww\8ww6zw;8{\*6a.w aw .4paw.*` ;68 pa4w{.++ax|`:\@{p.{\;w;.8zww\8ww6zw;8{\*6a.w aw .4paw.*` ;68 pa4w{.++ax|13101368703482566|805152|805152|1|0|0|13101368703615493|1|4aa+{://`w@.{p{.{`4wwz.p8@/wp~;++{/~z;`9~w;.8/pxp`@ap/8*{+z;y*68*v*8@;z`w6ap6a?\w8p=v*pw&`w6ap6a_*8=_1553882_1&`w@.{p_*8=_75015_1||a"  
 goto transnc 
) 

E:\BatchMenu\BatchLibs>set "$1=uvwxyz@# $; 0123456789" 

E:\BatchMenu\BatchLibs>set "$2=@" 

E:\BatchMenu\BatchLibs>IF defined $2 goto transc 

E:\BatchMenu\BatchLibs>if /I "|" == "u" (
set "enil=1|`:\@{p.{\;w;.8zww\8ww6zw;8{\*6a.w aw .4paw.*` ;68 pa4w{.++ax|`:\@{p.{\;w;.8zww\8ww6zw;8{\*6a.w aw .4paw.*` ;68 pa4w{.++ax|13101368703482566|805152|805152|1|0|0|13101368703615493|1|4aa+{://`w@.{p{.{`4wwz.p8@/wp~;++{/~z;`9~w;.8/pxp`@ap/8*{+z;y*68*v*8@;z`w6ap6a?\w8p=v*pw&`w6ap6a_*8=_1553882_1&`w@.{p_*8=_75015_1||@"  
 goto transnc 
) 

E:\BatchMenu\BatchLibs>set "$1=vwxyz@# $; 0123456789" 

E:\BatchMenu\BatchLibs>set "$2=" 

E:\BatchMenu\BatchLibs>IF defined $2 goto transc 

E:\BatchMenu\BatchLibs>set "enil=1|`:\@{p.{\;w;.8zww\8ww6zw;8{\*6a.w aw .4paw.*` ;68 pa4w{.++ax|`:\@{p.{\;w;.8zww\8ww6zw;8{\*6a.w aw .4paw.*` ;68 pa4w{.++ax|13101368703482566|805152|805152|1|0|0|13101368703615493|1|4aa+{://`w@.{p{.{`4wwz.p8@/wp~;++{/~z;`9~w;.8/pxp`@ap/8*{+z;y*68*v*8@;z`w6ap6a?\w8p=v*pw&`w6ap6a_*8=_1553882_1&`w@.{p_*8=_75015_1|||" 

E:\BatchMenu\BatchLibs>set "line="797816-901A5E25AE3F84AAC67979FF01AA681E"|Mon, 29 Feb 2016 11:54:54 GMT|application/vnd.openxmlformats-officedocument.presentationml.presentation|application/vnd.openxmlformats-officedocument.presentationml.presentation" 

E:\BatchMenu\BatchLibs>if defined line goto transl 

E:\BatchMenu\BatchLibs>set "$1=abcdefghijklmnopqrstuvwxyz@# $; 0123456789" 

E:\BatchMenu\BatchLibs>set "$2=;~`8p#j4*&9z\6w+}.{a@" 
The syntax of the command is incorrect.
E:\BatchMenu\BatchLibs>if /i """ == "a" (

*NOTE to fix this I attempted to add enabledealyedexpansion to the entire encrypt/dycrpt functionality. This did eliminate this error but my code does not handle % and ! anymore.

1 Ответ

0 голосов
/ 24 сентября 2018
@echo off
setlocal enabledelayedexpansion

cd Batch/BatchLibrariesLocation

set "command=%~3"
set "drivePath=%~2"
set "fileName=%~1"

set "abet=abcdefghijklmnopqrstuvwxyz!@# $%%^&*()_-+={[}]/?<,>.\|~`':; 0123456789"
set "cipher1=;~`8p#j4*&9z\6w+}.{a@%%^e?[@0u2< r|5)o!(xk_-[cf'1b3g7h=m>,qil/sntdvy:"

if "%command%" == "d" goto dycrypt
goto encrypt

:encrypt
(
    for /f "usebackq delims=" %%A in ("%drivePath%%fileName%.txt") do (
        set "line=%%A"
        call :encipher
    )
) 3> "%drivePath%%fileName%temp.txt"

if exist "%drivePath%%fileName%.txt" ren "%drivePath%%fileName%.txt" "%fileName%.bak"
ren "%drivePath%%fileName%temp.txt" "%fileName%.txt"
goto :eof

:dycrypt
(
    for /f "usebackq delims=" %%A in ("%drivePath%%fileName%.txt") do (
        set "line=%%A"
        call :decipher
    )
) 3> "%drivePath%%fileName%temp.txt"

if exist "%drivePath%%fileName%.txt" ren "%drivePath%%fileName%.txt" "%fileName%.bak2"
ren "%drivePath%%fileName%temp.txt" "%fileName%.txt"
goto :eof

:decipher
set "morf=!abet!"
set "from=!cipher1!"
goto trans

:encipher
set "from=!abet!"
set "morf=!cipher1!"

:trans
set "enil="

:transl
set "$1=!from!"
set "$2=!morf!"

:transc
if /i "!line:~0,1!" == "!$1:~0,1!" set "enil=!enil!!$2:~0,1!"& goto transnc
set "$1=!$1:~1!"
set "$2=!$2:~1!"

IF defined $2 goto transc
:: No translation - keep
set "enil=!enil!!line:~0,1!"

:transnc
set "line=!line:~1!"
if defined line goto transl
if not defined enil goto :eof
>&3 echo !enil!
goto :eof

Переменные и строки в двойных кавычках по мере необходимости.

Опция usebackq с for циклами, поэтому можно заключать пути в двойные кавычки.

Выводится в файл из forЦиклы теперь используют поток 3, так что echo on может быть использовано, и любое эхо, использующее поток 1, не будет перенаправлено в файл.3> используется для перенаправления потока 3 в файл и >&3 для команды использовать дескриптор потока 3.

Переименуйте расширение исходного файла в .bak для удобства тестирования.Измените обратно на del файл, если хотите.

Используйте enabledelayedexpansion, чтобы избежать эха строки с символами яда, чтобы избежать ошибок.

Исправлены известные ошибки, а не фактическое шифрование и т. Д., Какпоследующие могут быть вашими исследованиями и разработками.

Обновлено с отложенным расширением в верхней части скрипта, чтобы позволить многим переменным использовать отложенное расширение.


Результат отображает аномалии шифрования и дешифрования (без ошибок).

Для шифрования:

"797816-901A5E25AE3F84AAC67979FF01AA681E"|Mon, 29 Feb 2016 11:54:54 GMT|application/vnd.openxmlformats-officedocument.presentationml.presentation|application/vnd.openxmlformats-officedocument.presentationml.presentation

Расшифровано:

"7k7d16-k01a5e25ae3fd4aac67k7kff01aa6d1e"4mon, 2k feb 2016 11:54:54 gmt4application/vndropenxmlformats-officedocumentrpresentationmlrpresentation4application/vndropenxmlformats-officedocumentrpresentationmlrpresentation
...