Переполнение пути к пакетному файлу - PullRequest
0 голосов
/ 03 августа 2011

Иногда у меня есть такой пакетный файл:

Action.bat:

Set PATH=%PATH%;C:\Some\Folder\I\Need

foo.exe Bar1
foo.exe Bar2
foo.exe Bar3
@Rem Etc...

, где foo.exe - программа, в которой ожидает, что PATH будет содержать определенноекаталог .

Тогда я решу использовать его - угадайте, что?- пакетная обработка:

For /R %%f In (*) Do Call Action.bat "%%~f"

Теперь, когда я запускаю это, PATH легко переполняется .

Как правильно предотвратить такое переполнение?

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Использование SETLOCAL:

@ECHO OFF
SETLOCAL
SET PATH=%PATH%;C:\Some\Folder\You\Need

foo.exe Bar1
…
:: ENDLOCAL is implied at the end of the script, but you can add it explicitly
ENDLOCAL

Все изменения переменных среды в области действия SETLOCAL являются локальными.То есть они сбрасываются при выполнении ENDLOCAL.

0 голосов
/ 05 августа 2011

Если у вас установлен ActiveState perl, вы можете использовать perl one-liner.Добавьте это в Action.bat:

set _dir=C:\Some\Folder\You\Need
perl -e "($x=$ARGV[0])=~tr/\\/\//;($p=';'.$ENV{q(PATH)}.';')=~tr/\\/\//;exit 1 if $p!~m[;$x/?;]i" %_dir%
if errorlevel 1 set path=%path%;%_dir%

Сведения о Perl:

# get directory to add from cmd line; replace \ with /
($x=$ARGV[0])=~tr/\\/\//;
# get path, surround with ";" to simplify matching, replace \ with /
($p=';'.$ENV{q(PATH)}.';')=~tr/\\/\//;
# return errorlevel 1 if directory not already in path
exit 1 if $p!~m[;$x/?;]i"

Если вы делаете это много раз, конечно, будет быстрее иметь пакетный файл оболочкисделать это только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...