CMD变量不变

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (50)

我正在写我的第一个小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,我只想做这个脚本来帮助我从指定的文件中生成一个压缩文件。

示例:我打开了一个新的CMD窗口。第一次运行我的代码和输入是"helloWorld"(我的目录中有一个名为"helloWorld.py")

它创建一个名为“%filename%.zip”的zip文件,并且它只包含Licse.txt,没有其他任何内容。

但是当我第二次运行它时(仍然打开CMD窗口),不管输入是什么,它记得上次定义的变量%filename%,并使用正确的名称和内容创建正确的zip文件.

我希望我的输入定义zip文件的名称,并且它应该用我的输入作为名称压缩Licse.txt和python脚本。

如果有任何不同,我将我的文件保存为.bat。

提问于
用户回答回答于

第一个问题是,除非您开始你的批处理

@echo off
setlocal

对象的任何特定实例的运行中设置的任何值。cmd窗口保持为该命令窗口实例设置。

@echo off仅仅是普通的启动指令,它可以启动命令回显。off。命令回显(在执行之前命令被回显到控制台)是标准模式。它可以左转或转on为了调试的目的,但通常您不希望看到一步步的说明.

setlocal命令建立一个局部环境(它也有其他用途,但请在运行之前试着走路.),以便添加/删除/更改任何变量当批处理结束时(或endlocal执行命令)。通过这种方式,您可以保持环境“干净”,这样连续的批处理就不会使环境中的添加、删除和更改变得杂乱无章。

第二个实例与delayed expansion(关于这个问题有许多文章-使用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:\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这个问题号是在上面吗?这样我就可以很容易地查阅它和它的测试文件了。

用户回答回答于

更改引用并在本地使用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
)

扫码关注云+社区

领取腾讯云代金券