2013-08-29 3 views
1

Я пытаюсь запустить скрипт R через пакетный файл, который я написал. Я хочу, чтобы пакетный скрипт был гибким, чтобы я мог перенести его на другие компьютеры или запустить его с сетевого диска, и он будет работать во всех случаях. Я собираю путь к файлу, из которого открывается командный файл, а затем используйте этот путь для активации скрипта R.Ampersand в пути к файлу для Rscript.exe

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

Вот код:

@ECHO OFF 
setlocal EnableDelayedExpansion 
set "_SCRIPT_DRIVE=%~d0" 
set "_SCRIPT_PATH=%~p0" 
set "PATH=!_SCRIPT_DRIVE!!_SCRIPT_PATH!" 

Это, кажется, работает как хотелось бы, так как, когда я

ECHO !PATH! 

Я получаю желаемый выход

C:\\A&B\File 

Однако, когда Позднее я запускаю это через команду Rscript.exe, он не распознает задержанное расширение и выполняет амперсанд как особый персонаж. Вход:

"!PATH!\R-3.0.1\bin\Rscript.exe" "!PATH!Scripts\Test.R" 

Returns:

'C:\\A' is not recognized as an internal or external command, operable program or batch file. 

Я только эта проблема, хотя, когда я пытаюсь запустить Rscript.exe. Я отлично могу открыть файл, такой как

"!PATH!Scripts\Test.R" 

И он работает без проблем. Кто-нибудь еще сталкивался с этой проблемой раньше? Кто-нибудь видит какие-либо проблемы с моим синтаксисом?

EDIT: решаемые

Для тех, кто натыкается на этот пост в будущем, мне удалось найти решение этой проблемы. Оказывается, это вовсе не ошибка пакетного скрипта, а проблема с Rscript.exe, я не уверен, что происходит. Вместо использования Rscript.exe, расположенного непосредственно в \bin, вы должны пойти еще на один шаг и использовать "!PATH!\R-3.0.1\bin\i386\Rscript.exe", который работает, скорее всего, потому что я запускаю 32-битную машину, а не 64.

+0

вы должны а) удалить '&' от пути ** или ** б) использовать другой язык скриптов (VBS, Powershell). – Endoro

+0

Обратите внимание, что в показанном коде нет причин использовать отложенное расширение. Вы можете просто использовать обычную замену '% ... %'. –

ответ

1

С пакетными файлами вы можете заставить это работать обычно, избегая & с ^. У меня нет оконной машины, но вы можете сначала проверить вручную, если это работает, и если это так, я могу работать с вами, если необходимо, для реализации функции, которая выполняет экранирование строки.

Для замещения одного из двух ниже Shoule работы (простите меня, как у меня нет машины Windows),

set workable_filename=%file_name:^&=^^&% 
set workable_filename=%file_name:&=^&% 
@REM:: I cannot test, but one of these should work 
+0

Я понимаю, что я могу избежать специальных символов с помощью ^, но амперсанд находится в середине моего пути, и каждый раз я читаю переменную. Единственный способ обойти это - запустить цикл замещения в переменной пути каждый раз, когда я запускаю, чтобы заменить каждый экземпляр «&» на «^ &», но у меня возникают проблемы с его работой. – Mustangz

+0

Хорошо круто :) Пока вы готовы это сделать. Лемм даст вам петлю. Одну секунду. – kikuchiyo

+0

Прохладный, я обновил путь. Я знаю, что URL-адреса не рекомендуются, но это было с тех пор, как я работал с DOS более четырех лет назад, поэтому, вероятно, он никуда не денется: http://www.dostips.com/DtTipsStringManipulation.php – kikuchiyo

Смежные вопросы