Batch file 读取输入文本文件和生成输出命令的批处理脚本

Batch file 读取输入文本文件和生成输出命令的批处理脚本,batch-file,Batch File,我有一个批处理文件,它将使用一个文件作为输入运行csc。我想修改它以从文件中读取引用,并将它们添加到脚本运行时执行的行中 我试过几种不同的方法,但似乎都不管用。引用添加了/r:,然后每个引用路径都有分号作为分隔符 理想情况下,我只希望在文本文件的新行上有一个引用。ref.txt文件与输入文件位于同一目录中,我不确定它是否正在该目录中查找。我还想让它尝试在没有ref.txt文件的情况下运行,因此我添加了exists行来执行此操作。我以前从未使用过批处理脚本,所以也许其他人比我更知道如何做。我认为第

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

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

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

该脚本在Notepad++中工作,并由此生成。我认为现在run命令也需要修改

这是记事本++中的run命令:

C:\bin\csc.bat“$(当前\u目录)\$(名称\u部分).exe”“$(完整\u当前\u路径)”
这是该答案的版本:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc/out:%1%2
@回音
如果错误级别为1(
暂停
出口
)
开始%1%1
这是尝试使用引用:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc/out:%1%2
@回音
如果错误级别为1(
暂停
出口
)
如果不存在ref.txt转到:写入
设置a=/r:
set refs=类型ref.txt
开始%1%a%和%refs%以及%1
出口
写
开始%1%1
refs.txt文件包含如下文件路径:

C:\windows\some\u path\some\u file.dll;C:\windows\some\u path\other\u file.dll;
来自的命令示例如下:

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

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
)
我不确定示例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
采样(回波)输出


我不知道您试图解释什么,但是
设置a=/r:
设置一个值为
/r:
的变量
a
,这肯定不是您想要的。删除
=
周围的空格,或者更好地使用最佳实践
设置“a=/r:”
(注意引号的位置)谢谢,我会试试的。我遵循的是一个例子,它没有引号。我更新了我的问题,添加了一些额外的细节,试图让它更清楚这一行中
的目的是什么
开始%1和%a%和%refs%和%1
?与其他问题相同。。。加上将
set refs=type ref.txt
更改为
set“refs=type ref.txt”
。将
write
标签更改为
:write
。您可能是想让
start%1和%a%以及%refs%和%1
成为
start%1%a%&%refs%&%1
。您可能想让
开始%1%1
成为
开始%1%2
???请注意,在编写时,如果%1或%2包含空格,您将遇到问题。除以上几点外:使用
set refs=type ref.txt
use
谢谢,这几乎对我有效。没有尾随分号,因为有两个以上的参考文献,所以我不应该把它放进去。我必须硬编码ref.txt的文件路径,因为它不是批处理脚本所在的位置,而是C代码所在的位置。ref路径中有空格,所以我必须用引号将它们括起来。是否可以将每个路径放在新行上,并让脚本包装引号和分号?我试过这样做,我认为csc要接受引用,它必须是一行,但可以从ref.txt文件中的几行组合而成,我不确定整个引用必须是双引号还是单引号。编辑问题以包含新ref.txt的示例。如果使用
%2
提供.cs的路径,则可以使用
%~dp2
提取路径,从而引用相同的文件夹。每个引用在引用的路径后都用分号引用,如下所示<代码>“C:\windows\some\u path\some\u file.dll”除了最后一个没有分号的ref。谢谢
%~dp2
正在工作!请参阅更改的答案,scs命令仅回显,以执行删除前面的回显。
:: 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