我创建了以下配置文件,其中包含批处理文件要使用的参数:
文件 winscp.conf :
DFMd <- structure(list(AD = c(0.5, 0.5, 0, 0, 0, 0, 0, 0, 0), AE = c(0.5,
0.5, 0, 0, 0, 0, 0, 0, 0), AF = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L), BD = c(0, 0, 0, 0.5, 0.5, 0, 0, 0, 0), BE = c(0, 0,
0, 0, 0.5, 0.5, 0, 0, 0), BF = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L), CD = c(0, 0, 0, 0, 0, 0, 0.5, 0.5, 0), CE = c(0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L), CF = c(0, 0, 0, 0, 0, 0, 0.5, 0,
0.5)), .Names = c("AD", "AE", "AF", "BD", "BE", "BF", "CD", "CE",
"CF"), class = "data.frame", row.names = c("AD", "AE", "AF",
"BD", "BE", "BF", "CD", "CE", "CF"))
批处理文件( get.bat ):
folder %appData%\winscp
version 5.7.4
visit http://sourceforge.net/projects/winscp/files/WinSCP/
download http://sourceforge.net/projects/winscp/files/WinSCP/5.7.4/winscp574.zip
当我像这样调用批处理文件时:
@echo off
setlocal
@if not exist "%1" (
echo Config file not found in "%1"
exit /B
)
@for /f "tokens=1,2 delims= " %%A in (%1) do (
set %%A=%%B
)
mkdir %folder%
我在当前文件夹中创建了一个子文件夹%appData%\ winscp ,如下所示:
get.bat winscp.conf
虽然我想要的是在Windows应用程序数据文件夹中创建的 winscp 文件夹,如下所示:
c:\Temp\%appData%\winscp
我认为语句C:\Users\Caffe\AppData\Roaming\winscp
有问题,因为如果我将其更改为set %%A=%%B
,我会按照我想要的方式创建文件夹。
答案 0 :(得分:2)
通过添加call
:
call set %%A=%%B
答案 1 :(得分:2)
我只是总结了wOxxOm和JosefZ的答案,并添加了一些小改进。
@echo off
setlocal EnableExtensions
set "ConfigFile=%~1"
if "%ConfigFile%" == "" (
echo %~nx0 must be called with name of configuration file
echo as first parameter, for example: %~nx0 winscp.conf
goto EndBatch
)
if not exist "%ConfigFile%" (
echo Config file "%ConfigFile%" not found.
goto EndBatch
)
set "folder="
for /F "usebackq tokens=1*" %%A in ("%ConfigFile%") do call set "%%A=%%B"
if "%folder%" == "" (
echo Option "folder" not defined in config file "%ConfigFile%".
goto EndBatch
)
mkdir "%folder%" 2>nul
:EndBatch
endlocal
为了更好地读取传递给批处理文件的第一个参数,该参数会立即分配给环境变量,而不包含周围的引号,如果带或不带路径的配置文件名包含至少1个空格字符,则必须使用该引号。
接下来,检查是否使用参数调用批处理文件。
在 FOR 循环之后,验证配置文件是否确实包含folder
的条目。
使用引号创建目录,因为文件夹路径可以包含空格,并将任何错误消息重定向到设备 nul ,即如果目录已存在则禁止输出错误消息。
答案 2 :(得分:1)
代码中的下一个更改:
Hello("Hi")
代替call set
set
代替for /f "tokens=1,*
然后下一个代码段应该有效:
for /f "tokens=1,2