これを理解するのに数日かかったので、これを伝えたかっただけです。私はバッチの男ではなく、よりUNIXの男ですが、私が持っているのは、マウントされたUNIXドライブから実行され、WindowsのコマンドプロンプトからWindowsおよびUnixでビルドスクリプトを実行するbuild.batです。以前はパスをbatファイルにハードコーディングしていましたが、Unixのどこにでもスクリプトを配置し、ユーザーがソースを自分のサンドボックスにチェックアウトし、ドライブをマウントしてコマンドプロンプトを開いて、スクリプトディレクトリにcdして、ビルドを実行します。このスクリプトから実行される多くのプロセスがあります。そのため、マウントされたドライブからパスを取得する必要がありました。繰り返しますが、おそらくもっと簡単または短い方法があると確信していますが、これは私にとってはうまくいきます:
@echo off
set USERNAME=%1
set PASSWORD=%2
setlocal enabledelayedexpansion
:: All scripts are run from the same script directory on the mounted unix drive
::
:: Get the unix path to the scripts directory by using the following command
::
:: net use %~d0
::
:: %~d0 - drive letter where the script is running from
:: %~dp0 - complete path to this script
::
set WIN_PATH=%~dp0
set DRIVE_LETTER=%~d0
:: get "Remote Name" from net use command
FOR /F "tokens=*" %%i in ('net use %DRIVE_LETTER% ^| FINDSTR /I "^Remote"') DO SET NET_USE_OUTPUT=%%i
:: Get mounted unix drive from net use drive_letter, returns //ServerName/mount
FOR /F "tokens=3" %%A IN ("%NET_USE_OUTPUT%") DO SET MOUNTED_DRIVE=%%A
:: substitute drive_Letter for mounted_drive \\serverName\mount\path\to\scripts
set WIN_MOUNTED_PATH=!WIN_PATH:%DRIVE_LETTER%=%MOUNTED_DRIVE%!
:: Change to win to Unix slashes //serverName/mount/path/to/scripts
set UNX_MOUNTED_PATH=%WIN_MOUNTED_PATH:\=/%
:: get SERVER_NAME
FOR /F "tokens=1 delims=/" %%A IN ("%UNX_MOUNTED_PATH%") DO SET "SERVER_NAME=%%A"
:: Remove //serverName from full path - not needed on unix server
SET "SERVER_NAME_REMOVE=*//%SERVER_NAME%"
:: Remove serverName to get unix path to scripts directory
:: SCRIPTS = /path/to/scripts
CALL SET SCRIPTS=%%UNX_MOUNTED_PATH:!SERVER_NAME_REMOVE!=%%
:: Run script on Unix using plink
pink -pw %PASSWORD% %USERNAME%@%SERVER_NAME% "%SCRIPTS%/run.sh"
:: Run script on Windows
%WIN_PATH%run.bat