Сообщение об ошибке «Отказано в доступе» для текстового файла, который я только что сделал? - PullRequest
1 голос
/ 03 декабря 2010

Около 3 дней назад я задал вопрос, который можно найти здесь:

как заменить строку во второй строке в текстовом файле с помощью командного файла?

Я конвертирую буквы в текстовом файле в их соответствующие числа. Я получаю сообщения об ошибках, такие как «Отказано в доступе» и «Не удается найти этот файл» - но тот же пакетный файл, который дает мне все эти ошибки, также является тем, из-за которого эти текстовые файлы начинались! Поэтому он должен находиться в том же каталоге, что и сам пакетный файл (если не указано иное), верно? Я даже пошел в эту папку и проверил, и они там.

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

attrib +h C:\script\%name%.txt

Может ли сокрытие файла с помощью этой команды сделать его невидимым для пакетных программ, которые ищут его / вызывают его?

Вот ссылка на файл "stringparsing.bat": http://uploading.com/files/a1m1d2f4/stringparsing.bat/

Если бы вы помогли мне заставить эту программу выполнить свою задачу без каких-либо ошибок, она была бы очень признательна!

Вот файл "stringparsing.bat" полностью:

@echo off
setlocal enabledelayedexpansion 
title BETA
cls
cd C:\script\st
echo.
echo.
echo.
echo      Setting Variables...
echo      Loading Language Database...

:: ###################################################################################
::    CALLING VARIABLE DATABASE CALLING VARIABLE DATABASE CALLING VARIABLE DATABASE
:: ###################################################################################




TIMEOUT /t 5 /nobreak > nul

goto MAIN

:MAIN
set foo=0
cls
echo.
echo.
echo.
echo.
echo            ===================================
echo             #################################        
echo             #######     Main Menu:    #######
echo             #################################
echo            ===================================
echo.
echo.
echo             1.) Create New Language File...
echo.
echo             2.) Load Existing Lanuage File...
echo.
echo             3.) Settings...

echo ---------------------------------------------------------

SET /p CHOICE= Select a Function:
IF %CHOICE%== 1 GOTO CREATE
IF %CHOICE%== 2 GOTO LOAD
IF %CHOICE%== 3 GOTO SETTINGS

GOTO MAIN

:CREATE
cls
title Step 1
echo.
echo.
echo.
echo         =================================================================================
echo.
set /p name=  please type a name for your new language file:
echo.
echo         =================================================================================
cls
echo. > %name%.txt
echo.
echo.
echo.
echo        ==============================================================
echo        ##############################################################
echo        #============================================================#
echo        #                                                            #
echo        # - After you hit enter you will be redirected               #
echo        #   to a Live Typer. so anything you type into               #
echo        #   it will be sent to %name%.txt.                           #
echo        #                                                            #
echo        #                                                            #
echo        # - Next, select load language File For Encoding!            #
echo        #                                                            #
echo        #============================================================#
echo        ##############################################################
echo        ==============================================================

set /p line1= :
echo %line1% >> %name%.txt 2> nul


echo %name% > Language_File.txt
attrib +h Language_File.txt
set /a foo+ =1
)
echo.
echo ==========================================================

goto LOAD



:LOAD
set /a foo+ =1
IF %foo%== 2 goto loadexternal
goto LOAD23

:loadexternal
echo.
echo language file is loading now!
set /p name=<Language_File.txt
timeout /t 4 /nobreak > nul
echo.
echo.
echo Language_File Loaded!
pause >nul
goto LOAD23

:LOAD23
cls
echo.
echo.
echo.
echo.
echo.
echo        Encoding Your Language File... Please Wait... 
echo.
echo.
echo.

for /f "delims=" %%i in (!name!.txt) do ( 
echo translating "%%i"
set var=%%i 
set var=!var:a=1 ! 
set var=!var:b=2 ! 
set var=!var:c=3 ! 
set var=!var:d=4 ! 
set var=!var:e=5 ! 
set var=!var:f=6 ! 
set var=!var:g=7 ! 
set var=!var:h=8 ! 
set var=!var:i=9 ! 
set var=!var:j=10 ! 
set var=!var:k=11 ! 
set var=!var:l=12 ! 
set var=!var:m=13 ! 
set var=!var:n=14 ! 
set var=!var:o=15 ! 
set var=!var:p=16 ! 
set var=!var:q=17 ! 
set var=!var:r=18 ! 
set var=!var:s=19 ! 
set var=!var:t=20 ! 
set var=!var:u=21 ! 
set var=!var:v=22 ! 
set var=!var:w=23 ! 
set var=!var:x=24 ! 
set var=!var:y=25 ! 
set var=!var:z=26 ! 

echo !var! 
) 

echo !var! > !name!.txt

pause >nul
TIMEOUT /t 5 /nobreak > nul

goto MAIN


:END
cls
title SHUTTING DOWN...
echo.
echo.
echo.
echo            Terminating service stream...
echo.
echo.
echo.
echo.
echo            Done! Thank you for using this program!
TIMEOUT /t 5 /nobreak > nul





::(%xx%) -1  I/O Stream= "SHELL.dll" 
:: IF EXIST [&1[Parser_2009]] exit

Exit


:: #####################################################################################

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

У вас есть несколько проблем. Во-первых, проблема отказа в доступе связана с тем, что вы перенаправляете на скрытый файл.

echo %name% > Language_File.txt
attrib +h Language_File.txt

Обратите внимание, что при первом запуске сценария он будет работать, поскольку Language_File.txt не существует и, следовательно, не будет скрыт. Во второй раз, когда вы запустите его, вам будет отказано в доступе. Я не знаю, почему Windows не позволяет вам сделать это. Вы можете решить эту проблему несколькими способами.

1. Сохраните ваш файл во временную директорию пользователя. При таком подходе ваш каталог не будет загроможден.

echo %name% > %TMP%\Language_File.txt

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

if not exist workspace mkdir workspace
echo %name% > workspace\Language_File.txt

3. Раскройте файл, прежде чем использовать его. Поскольку файл может не существовать при первом запуске сценария, возможно, вам следует только attrib -h, если он существует.

if exist Language_File.txt attrib -h Language_File.txt
echo %name% > %TMP%\Language_File.txt
attrib +h Language_File.txt

4. Не используйте Language_File.txt! Я не понимаю, зачем тебе это нужно. Просто используйте переменные для хранения имени языкового файла. На самом деле, у вас уже есть имя в %name%, верно?

Во-вторых, вы должны проверить значение ваших переменных, чтобы увидеть, что они действительно содержат. Когда вы загружаете содержимое Language_File.txt в вашу переменную, оно загружает все содержимое. Это включает в себя скрытые символы новой строки \r\n, хотя сценарий, кажется, переносит их в переменную в виде пробелов. См:

c:\batch\t>echo language file is loading now!
language file is loading now
C:\batch\t>set /p name= <Language_File.txt
C:\batch\t>echo -%name%-
-langfile  -

Если вы повторяете %name% в окружении дефисов, вы можете видеть, что после него есть 2 пробела (предположительно) символов новой строки. Чтобы решить эту проблему, вы можете использовать set для обрезки завершающих символов.

C:\batch\t>echo language file is loading now!
language file is loading now
C:\batch\t>set /p name= <Language_File.txt
C:\batch\t>set name=%name:~0,-2%
C:\batch\t>echo -%name%-
-langfile-

Во втором примере `% name% не имеет скрытых символов.

Наконец, вам нужно всего лишь использовать ! для доступа к переменным, которые вы установили внутри цикла for. Поэтому все ссылки на !name! должны быть вместо %name%. Вероятно, это ваша ошибка «не удается найти файл».

0 голосов
/ 03 декабря 2010

вот файл "stringparsing.bat":

@echo off
setlocal enabledelayedexpansion 
title BETA
cls
cd C:\script\st
echo.
echo.
echo.
echo      Setting Variables...
echo      Loading Language Database...

:: ###################################################################################
::    CALLING VARIABLE DATABASE CALLING VARIABLE DATABASE CALLING VARIABLE DATABASE
:: ###################################################################################




TIMEOUT /t 5 /nobreak > nul

goto MAIN

:MAIN
set foo=0
cls
echo.
echo.
echo.
echo.
echo            ===================================
echo             #################################        
echo             #######     Main Menu:    #######
echo             #################################
echo            ===================================
echo.
echo.
echo             1.) Create New Language File...
echo.
echo             2.) Load Existing Lanuage File...
echo.
echo             3.) Settings...

echo ---------------------------------------------------------

SET /p CHOICE= Select a Function:
IF %CHOICE%== 1 GOTO CREATE
IF %CHOICE%== 2 GOTO LOAD
IF %CHOICE%== 3 GOTO SETTINGS

GOTO MAIN

:CREATE
cls
title Step 1
echo.
echo.
echo.
echo         =================================================================================
echo.
set /p name=  please type a name for your new language file:
echo.
echo         =================================================================================
cls
echo. > %name%.txt
echo.
echo.
echo.
echo        ==============================================================
echo        ##############################################################
echo        #============================================================#
echo        #                                                            #
echo        # - After you hit enter you will be redirected               #
echo        #   to a Live Typer. so anything you type into               #
echo        #   it will be sent to %name%.txt.                           #
echo        #                                                            #
echo        #                                                            #
echo        # - Next, select load language File For Encoding!            #
echo        #                                                            #
echo        #============================================================#
echo        ##############################################################
echo        ==============================================================

set /p line1= :
echo %line1% >> %name%.txt 2> nul


echo %name% > Language_File.txt
attrib +h Language_File.txt
set /a foo+ =1
)
echo.
echo ==========================================================

goto LOAD



:LOAD
set /a foo+ =1
IF %foo%== 2 goto loadexternal
goto LOAD23

:loadexternal
echo.
echo language file is loading now!
set /p name=<Language_File.txt
timeout /t 4 /nobreak > nul
echo.
echo.
echo Language_File Loaded!
pause >nul
goto LOAD23

:LOAD23
cls
echo.
echo.
echo.
echo.
echo.
echo        Encoding Your Language File... Please Wait... 
echo.
echo.
echo.

for /f "delims=" %%i in (!name!.txt) do ( 
echo translating "%%i"
set var=%%i 
set var=!var:a=1 ! 
set var=!var:b=2 ! 
set var=!var:c=3 ! 
set var=!var:d=4 ! 
set var=!var:e=5 ! 
set var=!var:f=6 ! 
set var=!var:g=7 ! 
set var=!var:h=8 ! 
set var=!var:i=9 ! 
set var=!var:j=10 ! 
set var=!var:k=11 ! 
set var=!var:l=12 ! 
set var=!var:m=13 ! 
set var=!var:n=14 ! 
set var=!var:o=15 ! 
set var=!var:p=16 ! 
set var=!var:q=17 ! 
set var=!var:r=18 ! 
set var=!var:s=19 ! 
set var=!var:t=20 ! 
set var=!var:u=21 ! 
set var=!var:v=22 ! 
set var=!var:w=23 ! 
set var=!var:x=24 ! 
set var=!var:y=25 ! 
set var=!var:z=26 ! 

echo !var! 
) 

echo !var! > !name!.txt

pause >nul
TIMEOUT /t 5 /nobreak > nul

goto MAIN


:END
cls
title SHUTTING DOWN...
echo.
echo.
echo.
echo            Terminating service stream...
echo.
echo.
echo.
echo.
echo            Done! Thank you for using this program!
TIMEOUT /t 5 /nobreak > nul





::(%xx%) -1  I/O Stream= "SHELL.dll" 
:: IF EXIST [&1[Parser_2009]] exit

Exit


:: #####################################################################################

Наконец-то я научился форматировать фрагмент кода. (вот ссылка на другую копию, если она вам нужна.)

как заменить строку во второй строке в текстовом файле с помощью командного файла?

...