web-dev-qa-db-ja.com

Windowsのfindコマンドを使用するcygwin bashからbatファイルを実行する方法

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

また、文字列に一致する行を検索するwindows findコマンドを使用して、ビルドを開始するbatファイルがあります(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ファイル(またはallWindows実行可能ファイル)を強制的に実行させる方法はありますか? cmd.exeのstart /i動作を考えています。環境(または少なくとも$PATH)を.bash_profile/.bashrcに保存して、これを行う独自のcygstartのようなユーティリティを作成することを考えています。それは理にかなっていますか?

他の提案はありますか?

編集:参照 新しいcmd.exeを開始し、環境を継承しない

37

chmod +x your.batが機能する場合。

./your.bat

cmd /cを介して実行されます

すでに Cygwinが.batスクリプトを実行できるのはなぜですか?

31
rurban

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
5
user2288008

内容は次のような_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_をパスに入れるか、フルパスで呼び出す必要があります。

2
Not an ID

@rusloによって与えられた答えは非常に便利でうまく動作しますが、冗長性があります:start "clean Shell" /Iはここでは何もしません:-)現在のcygwin envを取り除くのはExplorerピースですstart /iではありません!次のように、スクリプトの最後の行から省略してみてください。

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

同じ結果-「そのままのパス」!

startのヘルプを熟読すると、次のように表示されます:新しい環境は、現在の環境ではなく、cmd.exeに渡される元の環境になります。ええと、しかしこの場合cmdに渡される環境はcygwinの環境なので、start /iはここでは何も入力しません。

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

パスはまだcygwinのパスであり、Windowsシステムではありません!

0
dobriai

=== build.batスクリプトで...

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