42

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

Cygwin bash其标准目录添加到当前路径,因此 bash 内部$PATH通常是/bin:/usr/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS.

开始更新以提供更多详细信息

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

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 可执行文件)?我正在考虑start /icmd.exe 的行为。我正在考虑通过在/cygstart中保存环境(或至少$PATH)来编写我自己的类似实用程序来执行此操作。那有意义吗? .bash_profile.bashrc

还有其他建议吗?

编辑:另见启动新的 cmd.exe 而不是继承环境

4

5 回答 5

47

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

./your.bat

通过运行cmd /c

已经回答了为什么 Cygwin 可以运行 .bat 脚本?

于 2013-07-13T23:12:52.803 回答
5

我已经从这里测试了一个解决方案,它运行良好:

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

例子

to-run.bat脚本:

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

cygwinbash 脚本,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
于 2014-06-21T05:55:13.433 回答
3

您可以使用包装器,例如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使用 arg进行调用,wellDoneMS而不仅仅是. 当然,您必须放入您的路径,或者使用完整路径调用它。cmdFUBAR.bat wellDoneMScygstart -w launcher.bat cmdFUBAR.bar wellDoneMSlauncher.bat

于 2014-12-28T12:18:47.717 回答
1

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

SET "DOS_FIND_EXE=%SYSTEMROOT%\System32\find.exe"
...
dir | "%DOS_FIND_EXE%" "target"
if errorlevel 1 goto no_target_dir
...
于 2014-03-11T17:44:16.877 回答
1

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

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

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

仔细阅读帮助start,它说:新环境将是传递给 cmd.exe 的原始环境,而不是当前环境。好吧,但是在这种情况下传递给的环境cmd是 of cygwin,所以start /i在这里不会做任何有用的事情,正如您可以通过键入看到的那样:

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

路径还是那个cygwin,不是windows系统的!

于 2016-12-08T05:19:18.537 回答