CMD变量不会改变

时间:2018-06-03 13:24:48

标签: batch-file cmd zip

我正在编写我的第一个小cmd脚本,但我遇到了问题。 但首先要做的事情是:

pushd Z:\customScripts
echo %filename%
set /p filename=Enter filename please: && 7za.exe a -tzip Z:\customScripts\"%filename%".zip "%filename%".py license.txt

我刚刚开始使用cmd,我只想做这个脚本来帮助我一点点 7za从我指定的文件中生成一个zip文件。

示例案例: 我打开一个新的CMD窗口。我第一次运行代码时输入是"helloWorld"(我的目录中有一个名为"helloWorld.py"的文件) 它创建一个名为"%filename%.zip"的zip文件。它只包含license.txt 但是第二次运行它(使用相同的仍然打开的CMD窗口),输入的内容并不重要,它会记住上次定义的变量%filename%并创建正确的zip文件,其中包含正确的名称和内容....

我希望我的输入定义zip文件的名称,它应该将license.txt和python脚本压缩为输入作为名称。
如果它有任何区别,我将我的文件保存为.bat 我希望我能清楚地解决问题,有些人可以帮助我!

Screenshot

2 个答案:

答案 0 :(得分:0)

更改了引用并使用7z.exe在本地进行了测试,没有任何问题。

:: SO_50666890.cmd
@Echo off
Set "BaseFolder=Z:\customScripts\"

Pushd "%BaseFolder%" 
Set "filename="
set /p "filename=Enter filename please: "
if not defined filename exit /B 0
If exist "%filename%.py" (
  7z.exe a -tzip "%BaseFolder%%filename%.zip" "%filename%.py" license.txt
) else (
  Echo file : %filename%.py doesn't exist
)

答案 1 :(得分:0)

您似乎与批次的两个特征相冲突。

首先,除非您使用

启动批处理
@echo off
setlocal

然后,在cmd窗口的任何特定实例的任何运行中设置的任何值都将保留为该命令窗口实例设置。

@echo off仅仅是转换命令回显off的常用启动指令。命令回显(命令在执行前回显到控制台)是标准模式。出于调试目的,它可能会保留或转为on,但通常您不希望看到分步说明。

setlocal命令建立本地环境(它还有其他用途,但请在运行之前尝试走路...)以便添加/删除任何变量/在中更改批处理结束时(或执行endlocal命令)将批处理恢复为其起始值。通过这种方式,您可以保持环境“干净”,以便连续批次不会通过添加,删除和更改来混乱环境。

第二个是与delayed expansion相关的实例(关于这个问题有很多SO文章 - 使用search工具)。

批处理按逻辑行解析源行逻辑行。逻辑行是一个物理行或多个物理行,命令或命令序列在其上括起来。

此解析的第一步是在当时用%var%实际值替换任何var

因此,你的

set /p filename=Enter filename please: && 7za.exe a -tzip Z:\customScripts\"%filename%".zip "%filename%".py license.txt

因为它是单个逻辑行,所以首先替换%filename% (which will be the value established in the *last* run as your code stands) and then execute the set / p and if setting the variable is successful then execute the 7a command into which the value of filename`已被替换。

修复:

@echo off
setlocal

pushd Z:\customScripts
echo %filename%
set /p filename=Enter filename please: 
if defined filename 7za.exe a -tzip Z:\customScripts\"%filename%".zip "%filename%".py license.txt

popd

set /p的另一个奇怪特征是,如果你简单地回应输入,目标变量中的值将不会为空不变< / em>的

我怀疑这实际上是一个较大的脚本的一部分,但为了完整起见,我已经应用了结束popd

逐字测试代码:

ECHO ------------- START AT %time%
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"

pushd %sourcedir%
echo %filename%
set /p filename=Enter filename please: 
if defined filename c:\portable\PortableApps\PortableApps.com\App\7-Zip\7za.exe a -tzip %sourcedir%\"%filename%".zip "%filename%".py license.txt
DIR /a-d
POPD

GOTO :EOF

结果:

------------- START AT  1:52:17.58
ECHO is off.
Enter filename please: q50666890

7-Zip (A) 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
Scanning

Creating archive U:\sourcedir\q50666890.zip

Compressing  license.txt
Compressing  q50666890.py

Everything is Ok
 Volume in drive U has no label.
 Volume Serial Number is C653-9000

 Directory of U:\sourcedir

04/06/2018  01:52           141,778 q50666890.py
04/06/2018  01:52           150,829 license.txt
04/06/2018  01:52            64,954 q50666890.zip

这正是我的预期。

注意: - U:\sourcedir是我的测试目录

7za的副本位于指示

q50666890是关于SO的问号,所以我可以轻松地回顾它及其测试文件。