2017-01-18 223 views
1

因此,我有一个我写的bat文件,并且在设置文件路径中包含&的变量时遇到问题。如何设置环境变量&

现在这个工作,但我不能在复制命令中使用%SOURCE%或%DEST%变量。我收到一个错误。因此,我有完整的路径写在复制命令的原因。

@echo off 

echo Backing Up Build Files ^& Templates 
echo. 

:: do a dump of repo 
echo Creating Dump File 
svnadmin dump "Z:\Subversion\Build Files "^&" Templates" > "Z:\Subversion\Build Files "^&" Templates_repository-backup.dmp" 

:: copy dump file to backup location 
set YEAR=%date:~10,4% 
set MONTH=%date:~4,2% 
set DAY=%date:~7,2% 
set THE_DATE=%MONTH%_%DAY%_%YEAR% 

set SPACE_CHECK=%time:~0,1% 

if "%SPACE_CHECK%"==" " goto handlehourspace 

set HOURS=%time:~0,2% 

goto hourdone 

:handlehourspace 
set HOURS=0%time:~1,1% 

:hourdone 
set MINUTES=%time:~3,2% 
set SECONDS=%time:~6,2% 
set THE_TIME=%HOURS%_%MINUTES%_%SECONDS% 

set SOURCE="Z:\Subversion\Build Files "^&" Templates_repository-backup.dmp" 

set DEST="K:\IETM_Repo_Backup\Build Files "^&" Templates\Build Files "^&" Templates_repository-backup.dmp"_%THE_DATE%_%THE_TIME% 

echo Copying Dump File 
copy /Z "Z:\Subversion\Build Files "^&" Templates_repository-backup.dmp" "K:\IETM_Repo_Backup\Build Files "^&" Templates\Build Files "^&" Templates_repository-backup.dmp"_%THE_DATE%_%THE_TIME% 

echo Deleting Original Dump File 
del "Z:\Subversion\Build Files "^&" Templates_repository-backup.dmp" 

回答

1

有了自己的风格set DEST="K:\...."的报价是内容的一部分。使用扩展的SET语法set "DEST=K:\...."它们转义字符串但不是字符串的一部分。
在大多数情况下,你应该使用扩展语法

set "SOURCE=Z:\Subversion\Build Files & Templates_repository-backup.dmp" 

set "DEST=K:\IETM_Repo_Backup\Build Files & Templates\Build Files & Templates_repository-backup.dmp_%THE_DATE%_%THE_TIME%" 

copy /Z "%SOURCE%" "%DEST%" 

copy "%SOURCE%" ...线的报价都需要再次逃脱&符号和空格。

3

使用的语法如下:set "var=value"能在一个值,使用特殊字符:

set "x=this&that" 
echo "%x%" 
REM create a file: 
break>"%x%" 
dir this* 
REM remove the file: 
del "%x%" 
1

要必须格式化我建议使用WMI
日期/时间区域设置独立的方式和转储文件的备份留在内线仍然是文件名的最后一部分,而不是日期/时间戳记更好的使用。

@echo off 
echo Backing Up Build Files ^& Templates 
echo. 

:: get datetime string of the format yyyyMMddhhnnss. 
for /f "tokens=1-3 delims=.+-" %%A in (
    'wmic os get LocalDateTime^|findstr ^^[0-9]' 
) do Set _DT=%%A 
set THE_DATE=%_DT:~4,2%_%_DT:~6,2%_%_DT:~0,4% 
set THE_TIME=%_DT:~8,2%_%_DT:~10,2%_%_DT:~12,2% 

:: do a dump of repo 
echo Creating Dump File 
set "BFT=Build Files & Templates" 
set "svnBFT=Z:\Subversion\%BFT%" 
set "svnSRC=%svnBFT%_repository-backup.dmp" 
svnadmin dump "%svnBFT%" > "%svnSRC%" 

:: copy dump file to backup location 
echo Copying Dump File 
set "DEST=K:\IETM_Repo_Backup\%BFT%\%BFT%_repository-backup_%THE_DATE%_%THE_TIME%.dmp" 
copy /Z "%svnSRC%" "%Dest%" 

echo Deleting Original Dump File 
del "%svnSRC%" 
+0

'for/f“tokens = 2 delims ==。” %% a in('wmic os get localdatetime/value')do set _DT = %% a' – Stephan

+0

@Stephan同样的结果,我的版本允许按需使用小数秒和UTC偏移量。 – LotPings

+0

如果需要,只需从分隔符中删除点...';' – Stephan