批处理脚本以读取输入文本文件并构建输出命令

时间:2019-01-25 07:30:57

标签: batch-file

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

我尝试了几种不同的方法,但似乎无法正常工作。引用添加有/r:,然后每个引用路径都以分号作为分隔符。

理想情况下,我只想在文本文件的新行上添加参考。 ref.txt文件与输入文件位于同一目录中,我不确定它是否在此目录中查找。我还想使其尝试在没有ref.txt文件的情况下运行,因此我添加了现存行来执行此操作。我以前从未使用过批处理脚本,因此也许其他人比我更擅长于此。我认为第一行需要与起始行匹配,这是我在其他尝试中尝试执行的操作,但没有用。

该脚本可在Notepad ++中使用,并且来自此answer。我认为现在还需要修改run命令。

这是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

1 个答案:

答案 0 :(得分:1)

IIUR,您正在尝试将引用应用于已编译的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