2017-01-27 18 views
0

Любительский кодер здесь. У меня есть старый R-скрипт, который запускает статистику SoX для файлов в нескольких папках и записывает выходные данные в файлы txt. Один из пользователей попросил использовать его на своей машине Windows и хотел бы просто щелкнуть файл .bat для его запуска. Я сделал один, но он выводит статистику SoX в окно пакетного файла и txt-файлы, которые, как правило, выводятся, являются пустыми. Я читал это из-за того, как R обрабатывает stderr, но я не могу найти решение для своей проблемы. Я действительно только разбираюсь в R, но преподавал сам Python, поэтому, если есть альтернативное языковое решение, я все уши.Написание SoX Stats на файл при запуске через .bat

Мой "сокс-stats.R" Сценарий

setwd("~/R/sox-stats/") 

for(l in list.dirs(recursive=FALSE)){ 
    setwd(paste0("~/R/sox-stats/", l)) 
    print(paste0("Directory set to ", l)) 
    dir.create("./stats/", showWarnings = FALSE) 
    directoryAll <- list.files() 
    statFolder <- list.files(pattern="stats") 

    for(file in setdiff(directoryAll, statFolder)){ 
    firstSox <- paste("sox \"",file,"\" -n stats",sep="") 
    write(system(firstSox, intern = TRUE), paste("./stats/", file, "_stats.txt", sep="")) 
    print(paste0(file, " has been processed."))  
    } 
} 

Мой .bat файла

@ECHO OFF 
ECHO Hello, so you want to get some SoX Stats? 
ECHO ------------------------------------------------ 
ECHO   Press any key to start me up! 
PAUSE >NUL 
cd C:\Program Files\R\R-3.3.0\bin 
rscript sox-stats.R 
IF ERRORLEVEL 1 ECHO SoX Says: Something went wrong. Check messages 
above for clues. Press any key to close SoX Stats. 
IF NOT ERRORLEVEL 1 ECHO SoX Says: PROCESSING COMPLETE. Press any key to close this window 
and open your "sox-stats" folder. 
pause >nul 
IF NOT ERRORLEVEL 1 %SystemRoot%\explorer.exe "C:\Users\user\Documents\R\sox-stats" 

Заранее спасибо!

ответ

0

Одним из способов приблизиться к этому было бы использование Юлии, которая составляет available for Windows. Мясо процесса было бы что-то вроде:

run(pipeline(`soxi mytest.wav`,"soxi.out")) 

Этот код использует кавычку сигнализировать консольную команду Джулии, устанавливает трубу в имени файла и запускает все это. Вы можете изучить содержимое каталогов, как требуется, с помощью readdir() в массив имен файлов и поместить фильтр в массив по мере необходимости.