Windows 中批量编译 Kotlin 源代码时出错
Error on batch compiling Kotlin source code in Windows
在 Microsoft Windows 7
我在 C:\new
目录中有两个 Kotlin 源代码:
- hello1.kt
- hello2.kt
我可以在命令行中分别编译它们,它的当前工作目录是C:\
,例如>kotlinc hello1.kt
。但是当我尝试进行批编译时,出现错误:
C:\new>kotlinc *.kt
error: source file or directory not found: *.kt
备注:
kotlinc .\*.kt
的结果相同。
> dir *.kt
正确列出 .kt
个文件,因此问题不可能在 *
通配符中。
$ kotlinc *.kt
在 Linux
中正常工作。
我想知道是什么原因造成的?在 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
在 Microsoft Windows 7
我在 C:\new
目录中有两个 Kotlin 源代码:
- hello1.kt
- hello2.kt
我可以在命令行中分别编译它们,它的当前工作目录是C:\
,例如>kotlinc hello1.kt
。但是当我尝试进行批编译时,出现错误:
C:\new>kotlinc *.kt
error: source file or directory not found: *.kt
备注:
kotlinc .\*.kt
的结果相同。> dir *.kt
正确列出.kt
个文件,因此问题不可能在*
通配符中。$ kotlinc *.kt
在Linux
中正常工作。
我想知道是什么原因造成的?在 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