CMD 变量不会更改



我现在正在编写我的第一个小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"的文件(
它创建了一个名为"%文件名%.zip"的 zip 文件,它只包含许可证.txt没有其他内容.
但是第二次我运行它(使用相同的仍然打开的 CMD 窗口(, 我的输入是什么并不重要,它会记住上次定义的变量 %文件名%,并使用正确的名称和内容创建正确的 zip 文件。

我希望我的输入定义了 zip 文件的名称,它应该压缩许可证.txt以及将我的输入作为名称的 python 脚本.
如果有任何区别,我将我的文件保存为.bat.
我希望我把我的问题说清楚,有些人可以帮助我!

截图

您似乎违反了批次的两个特征。

首先,除非您开始批处理

@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设置/pand if setting the variable is successful then execute the7acommand into which the value of文件名'已被替换。

要修复:

@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的另一个奇怪特征是,如果您只需输入响应,则目标变量中的值不会为,而是保持不变

我怀疑这实际上是更大脚本的一部分,但为了完整起见,我应用了结束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:portablePortableAppsPortableApps.comApp7-Zip7za.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:sourcedirq50666890.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副本如图所示

SO上的这个问题编号q50666890,所以我可以轻松地参考它及其测试文件。

更改了报价并使用 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
)

最新更新