Изменить каталог и выполнить внешнюю команду в cmd - ERLANG

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

start() ->
    comparing(0000).

comparing(Num) ->
    file:set_cwd("F:\Documents\UPI\dump_rabbitmq\rabbitmq-dump-queue-v0.3-windows-amd64"),
    DirOut = os:cmd("dir"),
    io:format("DirOut=~p~n", [DirOut]),
    os:cmd('rabbitmq-dump-queue -uri="amqp://username:password@localhost:5672/" -queue=try -full -max-messages=5 -output-dir=E:\Programs\Erlang\erl8.3\usr'),
    NumMes = Num,
    io:format("NumMes=~p~n", [NumMes]),
    NameF = "msg-000",
    io:format("NameF=~p~n", [NameF]),
    FileName = concat(NameF, lists:flatten(io_lib:format("~p", [NumMes]))),
    io:format("FileName=~p~n", [FileName]),
    File = filelib:is_regular(FileName),
    io:format("File=~p~n", [File]),
    ...

Это только часть кода, где у меня есть проблема. В соответствии file:set_cwd("F:\Documents\UPI\dump_rabbitmq\rabbitmq-dump-queue-v0.3-windows-amd64") Я хочу изменить каталог. В этих двух строках я проверяю, изменился ли каталог:

DirOut = os:cmd("dir"),
io:format("DirOut=~p~n", [DirOut])

И в очереди os:cmd('rabbitmq-dump-queue -uri="amqp://username:password@localhost:5672/" -queue=try -full -max-messages=5 -output-dir=E:\Programs\Erlang\erl8.3\usr') Я хочу выполнить команду в cmd для сообщений дампа с сервера RabbitMQ. Я пытался изменить каталог с os:cmd("cd F:\Documents\UPI\dump_rabbitmq\rabbitmq-dump-queue-v0.3-windows-amd64"), но ничего не происходит. Любое предложение, как решить эту проблему?

РЕДАКТИРОВАТЬ

Проблема решена. Необходимо иметь две косые черты в этой строке: file:set_cwd("F:\\Documents\\UPI\\dump_rabbitmq\\rabbitmq-dump-queue-v0.3-windows-amd64") Догберт решил проблему в комментариях.

1 ответ

Решение

В коде есть две проблемы:

  1. Вы не можете изменить рабочий каталог с помощью os:cmd("cd ...")нужно позвонить file:set_cwd/1, os:cmd("cd ...") только изменит каталог для выполнения этой команды, изменение не будет сохраняться для будущих вызовов os:cmd/1,

  2. Вам необходимо экранировать косые черты, в противном случае они интерпретируются как escape-последовательность, если это допустимая escape-последовательность, иначе они игнорируются.

    1> io:format("~s~n~s~n", ["C:\abc\nop", "C:\\abc\\nop"]).
    C:abc
    op
    C:\abc\nop
    

Итак, изменив это:

os:cmd("cd F:\Documents\UPI\dump_rabbitmq\rabbitmq-dump-queue-v0.3-windows-amd64"),

чтобы:

file:set_cwd("F:\\Documents\\UPI\\dump_rabbitmq\\rabbitmq-dump-queue-v0.3-windows-amd64"),

должен исправить вашу проблему.

Другие вопросы по тегам