如何使用Shell脚本运行exe

时间:2019-01-24 14:07:51

标签: bash shell mks

我有一个带有2个参数的exe,它们都是csv,如下所示 splitline.exe /dir/file1.csv /dir1/file2.csv,这基本上将输入文件中的行拆分为输出文件中的2行。因此,我编写了一个Shell脚本来执行此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          其给出的输出为“无文件” 请更正我的错误,因为我是Shell脚本的新手

2 个答案:

答案 0 :(得分:1)

该模板如何:

#!/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,因此我尝试不使用其他命令,例如basenamefind等。至于驱动器名称D:,请检查。也许它被映射到/mnt/d之类的东西。

注3:我已根据Charles的评论修复了脚本。

答案 1 :(得分:0)

我会沿用这些内容:

#!/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“ AND”操作数结合在一起,如果先前的动作失败,则不会将其用于文件(不会将cSplit.exe引发错误的文件从初始目录中删除)并进行备份,则“完成”将从其行中丢失)。

如果未显示任何输出,则您将找不到任何文件。如果这还不够,您可以在find命令之后添加以下内容(需要与命令末尾位于同一行):| tee | grep '.' || echo 'no file'