如何从使用Windows find命令的cygwin bash执行bat文件

时间:2013-07-10 23:42:25

标签: batch-file cygwin

find命令在Windows和Unix中完全不同。在Windows上,它是一个fgrep - 类似的实用程序,列出了文件中的匹配行;在Unix上 - 和Cygwin上 - 它列出了符合某些标准的文件名。

Cygwin bash 将其标准目录预先到当前路径,因此内部bash $PATH通常为/bin:/usr/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS

开始更新以提供其他详细信息

例如,我有许多使用gnu find命令的脚本 - 例如脚本清除不包含文件的目录树:

purge-empty-dirs.sh
find . -depth -type d -empty | xargs rmdir -p

我还有一个bat文件来启动我的构建,它使用windows find命令,它搜索匹配字符串的行(类似于gnu grep)。

build.bat
...
dir | find "target"
if errorlevel = 1 goto no_target_dir
...

现在,为了让我的bash脚本正常工作,我需要/binc:\windows\system32之前的路径中。但是要运行我的bat文件,我需要c:\windows\system32/bin

之前的路径中

一般情况下,我们可能会声称所有bat文件都应该使用bash继承的原始环境执行,而不是修改后的。这有意义吗?

结束更新

这应该如何,但打破从bash执行的bat文件。解决这个问题的最佳方法是什么?

有没有办法强制Cygwin使用它开始的环境执行bat文件(甚至所有 Windows可执行文件)?我在考虑cmd.exe的start /i行为。我正在考虑通过在cygstart / $PATH中保存环境(或至少.bash_profile)来编写我自己的.bashrc类似实用程序。那有意义吗?

还有其他建议吗?

修改:另请参阅Start new cmd.exe and NOT inherit environment

5 个答案:

答案 0 :(得分:30)

如果chmod +x your.bat它有效。

./your.bat

通过cmd /c

运行

已在Why is it that Cygwin can run .bat scripts?

中回答

答案 1 :(得分:5)

我已经测试了来自here的解决方案并且效果很好:

start "clean shell" /i "%windir%\explorer.exe" "\path\to\your\script.bat"

实施例

to-run.bat脚本:

echo %PATH%
echo "TODO: some commands"
cmd

cygwin bash脚本,run-me.sh

#!/bin/bash -e
set -x

SCRIPT_WINPATH=`cygpath --windows --absolute "$1"`
EXPLORER_CYGPATH=`which explorer`
EXPLORER_WINPATH=`cygpath --windows --absolute "${EXPLORER_CYGPATH}"`

cmd /C start "clean shell" /I "${EXPLORER_WINPATH}" "${SCRIPT_WINPATH}"

试验:

chmod +x to-run.bat
chmod +x run-me.sh
./run-me.sh to-run.bat

答案 2 :(得分:2)

您可以使用包装,例如launcher.bat,其内容为

@echo off
setlocal
rem modify here based on your needs
set PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
call %*
endlocal
exit %errorlevel%

假设您要使用来自cygwin bash脚本的cmdFUBAR.bat wellDoneMS来调用cmdFUBAR.bat wellDoneMS,而不仅仅是cygstart -w launcher.bat cmdFUBAR.bar wellDoneMS,而是launcher.bat。当然,您必须将{{1}}放入您的路径中,或以完整路径调用它。

答案 3 :(得分:0)

===在build.bat脚本中......

SET DOS_FIND_EXE=%SYSTEMROOT%\system32\find.exe
...
dir | "%DOS_FIND_EXE%" "target"
if errorlevel = 1 goto no_target_dir
...

答案 4 :(得分:0)

@ruslo给出的答案非常有用并且运行得很好,但是它有一个冗余:start "clean shell" /I在这里什么都不做:-)这是explorer件摆脱了目前的cygwin env,而不是start /i!尝试从脚本的最后一行省略它,如下所示:

cmd /C "${EXPLORER_WINPATH}" "${SCRIPT_WINPATH}"

同样的结果 - “原始路径”!

仔细阅读start的帮助,它说:新环境将是传递给cmd.exe而不是当前环境的原始环境。嗯,但环境传递给在这种情况下,cmdcygwin的{​​{1}},因此start /i在这里没有任何用处,可以通过输入来看到:

cmd /c start /i cmd /c "path && pause"

路径仍然是cygwin的路径,而不是Windows系统!