Windows 中批量编译 Kotlin 源代码时出错

Error on batch compiling Kotlin source code in Windows

Microsoft Windows 7 我在 C:\new 目录中有两个 Kotlin 源代码:

我可以在命令行中分别编译它们,它的当前工作目录是C:\,例如>kotlinc hello1.kt。但是当我尝试进行批编译时,出现错误:

C:\new>kotlinc *.kt
error: source file or directory not found: *.kt

备注:

我想知道是什么原因造成的?在 Microsoft Windows 中有没有办法进行批量编译?

看起来 kotlinc.exe 不支持通配符模式作为参数。所以必须在Windows上使用kotlinc hello1.kt hello2.kt

Linux/Mac 上的 shell 解释器在执行可执行文件之前将 *.kt 等通配符模式扩展为具有匹配 file/folder 名称的参数字符串列表。因此 Linux/Mac 上的 shell 解释器不会用 *.kt 调用 kotlinc,而是用 hello1.kt hello2.kt.

调用可执行文件

Windows 命令处理器 cmd.exe 不在可执行文件的参数列表中提供这样的通配符扩展。可执行文件本身必须支持具有通配符模式的参数并搜索自身以匹配 files/folders.

一个 Windows 批处理文件解决方案将遵循适用于所有文件名的代码,但带有感叹号的文件名除外:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
rem Make the directory of the batch file the current directory.
pushd "%~dp0" || goto :EOF
if exist *.kt goto CreateFilesList
echo ERROR: There is no *.kt file in folder: "%~dp0"
echo/
pause
goto EndBatch

:CreateFilesList
set "FilesList="
for %%I in (*.kt) do set FilesList=!FilesList! "%%I"
rem The files list starts with a space character.
kotlinc.exe!FilesList!
if errorlevel 1 echo/& pause

:EndBatch
rem Restore the initial current directory.
popd
endlocal

一种较慢的解决方案也适用于 .kt 文件名中有一个或多个 ! 的文件名。

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Make the directory of the batch file the current directory.
pushd "%~dp0" || goto :EOF
if exist *.kt goto CreateFilesList
echo ERROR: There is no *.kt file in folder: "%~dp0"
echo/
pause
goto EndBatch

:CreateFilesList
set "FilesList="
for %%I in (*.kt) do call :AddToList "%%I"
goto RunKotlinC

:AddToList
set FilesList=%FilesList% %1
goto :EOF

:RunKotlinC
rem The files list starts with a space character.
kotlinc.exe%FilesList%
if errorlevel 1 echo/& pause

:EndBatch
rem Restore the initial current directory.
popd
endlocal

请注意文件名列表不是无限的。环境变量定义的最大长度为 8192 个字符,其中包括变量名称、等号、分配给环境变量的字符串值和终止空字节。添加到列表中的文件名没有路径。因此,只要一次 kotlinc.exe.

不应该编译数百个 .kt 文件,这个限制在这里应该没有问题。

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • popd /?
  • pushd /?
  • rem /?
  • set /?
  • setlocal /?

另请参阅:

  • Single line with multiple commands using Windows batch file