Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何从使用Windows find命令的cygwin bash执行bat文件_Batch File_Cygwin - Fatal编程技术网

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

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

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

purge-empty-dirs.sh
find . -depth -type d -empty | xargs rmdir -p
我还有一个bat文件来启动构建,它使用windows find命令,搜索与字符串匹配的行(类似于gnu
grep

现在,为了使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脚本中使用arg
wellDoneMS
调用
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"