Batch file 如何从使用Windows find命令的cygwin bash执行bat文件
Batch file 如何从使用Windows find命令的cygwin bash执行bat文件,batch-file,cygwin,Batch File,Cygwin,find命令在Windows和Unix中的作用完全不同。在Windows上,它是一个类似于fgrep的实用程序,列出文件中的匹配行;在Unix和Cygwin上,它列出符合某些条件的文件名 Cygwin bash将其标准目录前置到当前路径,因此在bash内部,$path通常是/bin:/usr/bin:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS 开始更新以提供其他详细信息 例如,我有许多使用gnufind命令的脚本——例如清除不包含文件的目录树
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命令,搜索与字符串匹配的行(类似于gnugrep
)
现在,为了使bash脚本正常工作,我需要/bin
位于c:\windows\system32
之前的路径中。但要运行bat文件,我需要c:\windows\system32
位于/bin
一般来说,我们可以宣称所有bat文件都应该使用bash继承的原始环境执行,而不是修改后的环境。这有意义吗
结束更新
这是应该的,但是破坏了从bash执行的bat文件。解决这个问题的最佳方法是什么
有没有办法强迫Cygwin在其开始的环境中执行bat文件(甚至所有Windows可执行文件)?我正在考虑cmd.exe的start/I
行为。我正在考虑通过在.bash\u profile
/.bashrc
中保存环境(或至少$PATH
),编写自己的cygstart
实用程序来实现这一点。这有意义吗
还有其他建议吗
编辑:如果您
chmod+x您的.bat运行正常,请参见
./your.bat
通过cmd/c运行
已在build.bat脚本中回答了
SET "DOS_FIND_EXE=%SYSTEMROOT%\System32\find.exe"
...
dir | "%DOS_FIND_EXE%" "target"
if errorlevel 1 goto no_target_dir
...
我已经测试了来自的解决方案,它运行良好:
start "clean shell" /i "%windir%\explorer.exe" "\path\to\your\script.bat"
例子
运行。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}"
测试:
您可以使用包装器,例如,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脚本中使用argwellDoneMS
调用cmdFUBAR.bat
,而不仅仅是cmdFUBAR.bat wellDoneMS
,您需要cygstart-w launcher.bat cmdFUBAR.bar wellDoneMS
。当然,你必须把launcher.bat
放进你的路径,或者用完整路径来调用它。由@ruslo给出的答案非常有用,效果很好,但其中有一个冗余:启动“clean shell”/I
在这里什么都不做:-)是资源管理器
一块去掉了当前的cygwin env,非启动/i
!尝试从脚本的最后一行中省略它,如下所示:
cmd /C "${EXPLORER_WINPATH}" "${SCRIPT_WINPATH}"
同样的结果——“原始路径”
仔细阅读start
的帮助,它说:新环境将是传递给cmd.exe的原始环境,而不是当前环境。好的,但是在本例中传递给cmd
的环境是cygwin
的环境,因此start/i
在这里没有任何用处,通过键入可以看出:
cmd /c start /i cmd /c "path && pause"
路径仍然是cygwin的路径,而不是windows系统 我怀疑您不理解我问题的要点,那就是我需要在原始环境中执行bat文件,从那以后,它一直在更改,您是对的。通常这无法工作,因为/bin
需要覆盖/cygdrive/c/Windows/Systems32
。在执行cmd/cbat
之前,您只能编写一个bat启动器来剥离cygwin路径。但后来你松了手。最好用shell脚本重写bat文件。bat文件很难读取和维护。在一个完美的世界里,我可以将bat文件重写为shell脚本。但我并不是生活在一个完美的世界里。查看我的评论上述方法能否将.bat
输出通过管道从bash传输到文本文件?我想我们大多数人只需要编写/x.bat
:)这适用于find.exe
,但不适用于所有bat文件的一般问题。谢谢。另一个问题还讨论了启动一个不继承当前环境的进程的相同问题cygwin上已经有一个/bin/run
,因此run.sh
可能不是最好的名称。所有这些都会为我弹出一个文件夹资源管理器窗口。
cmd /C "${EXPLORER_WINPATH}" "${SCRIPT_WINPATH}"
cmd /c start /i cmd /c "path && pause"