批处理文件问题:(此时出乎意料

时间:2016-11-04 07:05:00

标签: batch-file

我正在努力解决这个问题,并希望有人能够解决这个问题。这是我的代码:

:: Prerequisits
:: 1. AWS CLI
:: 2. Configure your AWS access key
::Config
set distribution=d
set devDistributionId=E2omitted
set devBucketName=dashboard.omitted.com
set prodBucketName=prod.omitted.com
set prodDistributionId=E4omitted

:: Inputs
set /P distribution=Development(d) or Production (p):
set /P sourceDir=Soruce Directory in htdocs:

:: Operations
if /I %distribution%==d (
set bucketName=%devBucketName%
set distributionId=%devDistributionId%
)

if /I %distribution%==p (
set confirmProd=n
set /P confirmProd=Copying to production. Are you sure you want to do this y/n:

echo %confirmProd%
if /I %confirmProd%==y (
set bucketName=%prodBucketName%
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
aws s3 cp s3://%bucketName% s3://%bucketName%/"%fullstamp%" --recursive
set distributionId=%prodDistributionId%
)
)

aws s3 cp C:\xampp\htdocs\%sourceDir% s3://%bucketName% --recursive
aws cloudfront create-invalidation --distribution-id %distributionId% --paths /*

我怀疑问题是变量confirmProd并且它没有被实例化,但我无法弄清楚原因。

2 个答案:

答案 0 :(得分:1)

在块语句(带括号的系列语句)中,整个块被解析然后执行。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于FOR ... DO(块)。因此,在块中设置dt将失败,因为您需要delayedexpansion模式和!dt!使用该值。关于延迟扩张的文章,请参阅关于延迟扩展的无尽文章。

答案 1 :(得分:0)

最终有效的是打破"套"来自"得到"根据Mangoo评论的if条件:

  

在一个块语句(带括号的系列语句)中,   整个块被解析然后执行。

以下是有效的代码:

:: Prerequisits
:: 1. AWS CLI
:: 2. Configure your AWS access key
::Config
set distribution=d
set devDistributionId=E2omitted
set devBucketName=dashboard.omitted.com
set prodBucketName=dashboard.omitted.com
set prodDistributionId=E4omitted

:: Inputs
set /P distribution=Development(d) or Production (p):
set /P sourceDir=Soruce Directory in htdocs:
if /I %distribution%==p (
set confirmProd=n
set /P confirmProd=Copying to production. Are you sure you want to do this y/n:
)

:: Operations
if /I %distribution%==d (
set bucketName=%devBucketName%
set distributionId=%devDistributionId%
)

if /I %confirmProd%==y (
set bucketName=%prodBucketName%
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
)
if /I %confirmProd%==y (
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"
)
if /I %confirmProd%==y (
aws s3 cp s3://%bucketName% s3://%bucketName%/"%fullstamp%" --recursive
set distributionId=%prodDistributionId%
)


aws s3 cp C:\xampp\htdocs\%sourceDir% s3://%bucketName% --recursive
aws cloudfront create-invalidation --distribution-id %distributionId% --paths /*