首页 > 解决方案 > 用于读取输入文本文件并构建输出命令的批处理脚本

问题描述

我有一个批处理文件,它将csc使用文件作为输入运行。我想修改它以从文件中读取引用,并将它们添加到脚本运行时执行的行中。

我尝试了一些不同的东西,但似乎无法让它发挥作用。添加引用/r:,然后每个引用路径都有分号作为分隔符。

理想情况下,我只想在文本文件的新行上有一个引用。该ref.txt文件与输入文件位于同一目录中,我不确定它是否在此目录中查找。我还想让它尝试在没有ref.txt文件的情况下运行,所以我添加了 exists 行来做到这一点。我以前从未使用过批处理脚本,所以也许其他人比我更清楚如何做到这一点。我认为第一行需要与起始行匹配,我在其他尝试中尝试过,但它不起作用。

该脚本在 Notepad++ 中工作,来自这个答案。我认为现在运行命令也需要修改。

这是 Notepad++ 中的运行命令:

C:\bin\csc.bat "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" "$(FULL_CURRENT_PATH)"

这是该答案的版本:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc /out:%1 %2

@echo off

if errorlevel 1 (
    pause
    exit
)

start %1 %1

这是使用引用的尝试:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc /out:%1 %2

@echo off

if errorlevel 1 (
    pause
    exit
)

if not exist ref.txt GOTO :write
set a = /r:
set refs = type ref.txt
start %1 %a% and %refs% and %1
exit
write
start %1 %1

refs.txt 文件包含如下文件路径:

C:\windows\some_path\some_file.dll;C:\windows\some_path\another_file.dll;

来自Microsoft的示例命令是:

csc /t:exe /r:MyCodeLibrary.dll;NewLib.dll *.cs

标签: batch-file

解决方案


IIUR 您正在尝试将 refs 应用于已编译的 exe 而不是 csc 本身。

您需要调整 ref.txt 文件的路径

:: Q:\Test\2019\01\25\SO_54360791.cmd
@echo off & Setlocal EnableDelayedExpansion
Set CSC="C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe"
Set Ref=".\ref.txt"

if exist %Ref% (
    <%Ref% Set /p "refs="
    set "refs=/r:!refs!"
) else set "refs="

%CSC% %refs% /out:%1 %2
if errorlevel 1 (
    pause
    exit
)

样本(回显)输出

> SO_54360791.cmd new.exe source.cs
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe" /r:C:\windows\some_path\some_file.dll;C:\windows\some_path\another_file.dll; /out:new.exe source.cs

我不确定示例 ref.txt 中的尾随分号是否有效。

编辑:带有 ref.txt 文件的变体,其中包含带引号的路径和尾随分号

:: Q:\Test\2019\01\25\SO_54360791.cmd
@echo off & Setlocal EnableDelayedExpansion
Set CSC="C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe"
Set Ref=".\ref.txt"
Set "refs="
if not exist %Ref% goto :cont
set "refs=/r:"
for /f "usebackq delims=" %%A in (%Ref%) Do set "refs=!refs!%%A"

:cont
echo %CSC% %refs% /out:%1 %2
if errorlevel 1 (
    pause
    exit
)
goto :Eof

样本(回显)输出

> SO_54360791.cmd new.exe source.cs
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe" /r:"C:\windows\some_path\some_file.dll";"C:\windows\some_path\another_file.dll"; /out:new.exe source.cs

推荐阅读