2015-02-06 108 views
0

我有一个批处理脚本,我从一个文件夹中运行,即在另一个文件夹中调用.NET可执行文件,然后将文件夹参数传递给另一个文件夹中存在的文件。它看起来像这样:windows批处理脚本指向正确的路径

SET start_dir=%cd% 
cd.. 
cd apps 
SET apps_dir=%cd% 
SET my_dir=%apps_dir%\MY_DIR 

cd C:\projects\ConsoleApplication1\src\ConsoleApplication1\bin\Debug 

ConsoleApplication1.exe -i -f %my_dir% 

cd %start_dir% 

这是将目录传递到批处理脚本中的应用程序的正确方法?我的应用程序似乎无法找到目录,但我不知道是否有方法在脚本中解决这些问题,或者如果这是正确的方式或不是,因为这是我第一次完成Windows批处理脚本。谢谢!

回答

0

应该是,但批处理对SET语句中的空格敏感。 SET FLAG = N设置一个名为“FLAG 空间”变量的“空间 N”

语法SET "var=value"(其中值可以是空的)用于确保任何杂散尾部空格不包括在所述值的值分配。 set /a可以安全地使用“无引号”。

当文件或目录名称中有空格时,这很重要。

我建议一些细微的变化:

@echo off 
setlocal 
SET "start_dir=%cd%" 
cd .. 
cd apps 
SET "apps_dir=%cd%" 
SET "my_dir=%apps_dir%\MY_DIR" 

cd "C:\projects\ConsoleApplication1\src\ConsoleApplication1\bin\Debug" 

ConsoleApplication1.exe -i -f "%my_dir%" 

cd "%start_dir%" 

注意到

  • 关闭@echo关闭命令回显批处理期间

  • SETLOCAL确保任何环境当批次结束时,所做的更改将被撤消,所以您不会遇到之前运行所做更改的陈旧数据问题

  • CD “destinationdir” - 引号是通常需要,即使 “在路径中的空间”,但可能需要为奇怪的路径名(如含&那些)

  • “%MY_DIR%”作为参数为consoleapplication1,以确保它视为一个单一的令牌

  • 如果consoleapplication1.exe是在路径上的目录,那么就没有必要cd到该目录;命令consoleapplication1 ....将访问它。当然,如果应用程序提供了一个不合格的文件名,然后它会假设该文件是在current目录,而不是executable的目录,所以有可能需要切换目录...

  • 如果consoleapplication1.exe位于不在路径上的目录中,则"C:\projects\ConsoleApplication1\src\ConsoleApplication1\bin\Debug\consoleapplication1" ....将访问它。如果包含引号,则引号是无害的,但对于完整可执行文件名称中的空格而言是必需的。

  • path从提示符中将显示执行路径;每个目录用分号分隔。

  • 有可能使用

@echo off 
setlocal 
SET "start_dir=%cd%" 
pushd ..\apps 
SET "apps_dir=%cd%" 
SET "my_dir=%apps_dir%\MY_DIR" 
pushd "C:\projects\ConsoleApplication1\src\ConsoleApplication1\bin\Debug" 

ConsoleApplication1.exe -i -f "%my_dir%" 
popd 
popd 

其中pushd切换到指定的目标目录当前保存在一个简单的堆栈。 popd从堆栈中弹出目录。