Как запустить EXE с помощью сценария оболочки

У меня есть exe, который принимает 2 параметра, оба являются CSV, как показано ниже splitline.exe /dir/file1.csv /dir1/file2.csv, это в основном разделяет строки во входном файле на 2 строки в выходном файле. Итак, я написал сценарий оболочки для выполнения этого EXE-файла. каталог фиксированный, но имя файла может отличаться, имя файла в каталоге src и каталоге назначения должно быть одинаковым. Я запускаю его в среде Windows. На нем установлен MKS, поэтому также можно выполнить сценарии unix и shell. Ниже приведен фрагмент кода, который я написал:

#!/bin/sh
 srcdir='D:/srcdir/srcdir1/'

 destdir='D:/destdir/destdir1/'

 extension='csv'

srcfile='${srcdir}/*.csv'

if [[-f ${srcfile} in ${srcdir}]]
  then
   cSplit.exe "${srcdir}/{srcfile}.${extension}" "${destdir}/${srcfile}.${extension}"
    mv "${srcfile}" "${srcdir}/old"
else
    echo "no file"
fi

вывод: [[-f: splitty.sh 21 не найден. Выводится как "нет файла". Пожалуйста, исправьте мою ошибку, так как я новичок в сценарии оболочки

2 ответа

Как насчет этого шаблона:

#!/bin/bash
src="D:/srcdir/srcdir1"               # no '/' at the end of dirname
dst="D:/destdir/destdir1"
cd "$src" || exit                     # do nothing if $src is not a directory

for f in *.csv; do
  if [[ "$f" = '*.csv' ]]; then
    echo "no files"
    break
  fi
  if [[ -f "$f" ]]; then
    echo cSplit.exe "$f" "$dst/$f"    # use 'echo' for testing
    echo mv "$f" "$src/old/."         #   aka dry run
  fi
done

Примечание 1: если вы используете Windows, то с помощью / в порядке bash; но команда cSplit.exe может не принять / в качестве разделителя каталогов. Я не использую Windows, поэтому я не могу это проверить.

Примечание 2: я действительно не знаю Windows, поэтому я пытался НЕ использовать другие команды, такие как basename, или же findи т. д. Что касается названия диска D: пожалуйста, проверьте. Может быть, это сопоставлено с /mnt/d или что-то.

Примечание 3: я исправил сценарий на основе комментариев Чарльза.

Я хотел бы использовать что-то вроде этого:

#!/bin/bash
cd 'D:/srcdir/srcdir1/'
find . -maxdepth 1 -name '*.csv' \
  -printf 'Handling %f...' \
  -a -exec cSplit.exe {} 'D:/destdir/destdir1/{}' \; \
  -a -exec mv {} ./old/ \; \
  -a -printf 'done\n'

Для каждого .csv файл в D:/srcdir/srcdir1/ В каталоге с этим будут выполнены следующие действия по порядку:

  • Начать писать Handling <file name>... на линии
  • казнить cSplit.exe с первым аргументом, являющимся (относительным) путем к файлу, а вторым путем к файлу с тем же именем, расположенным в D:/destdir/destdir1/ каталог
  • Переместить файл из D:/srcdir/srcdir1/ каталог к D:/srcdir/srcdir1/old каталог
  • Написать one с последующим переводом строки в конец строки.

Действия объединяются с -a Операнды "И" и не будут приняты для файла, если предыдущее действие не удалось (файл, для которого cSplit.exe выдал ошибку, не будет удален из исходного каталога и резервной копии, а "готово" будет отсутствовать с его линии).

Вы будете знать, что файлы не были найдены, если не отображаются выходные данные. Если вам этого недостаточно, вы можете добавить следующее после find команда (должна находиться в той же строке, что и конец команды): | tee | grep '.' || echo 'no file'

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