首次运行时未设置Windows CMD变量

ijxebb2r  于 2023-08-07  发布在  Windows
关注(0)|答案(2)|浏览(125)

我正在Windows 10命令提示符上使用此命令来检查文件夹是否存在,如果不存在,请创建它。奇怪的是,我第一次输入时它不起作用,但第二次,第三次,等等。它确实如此,就好像变量值在我第一次运行它时没有更新一样。

命令

set "folder=C:\Users\%USERNAME%\Desktop\New folder" &&
set "subfolder=new" &&
( IF exist "%folder%\%subfolder%" ( echo The "%subfolder%" subfolder already exists. ) 
ELSE ( mkdir "%folder%\%subfolder%" && echo Created the "%subfolder%" subfolder. ) )

字符串
第1次执行输出:

The "%subfolder%" subfolder already exists.


这个输出是错误的。子文件夹不存在,因为尚未创建。为什么变量不被展开?
第二次执行输出:

Created the "new" subfolder.


第一次就应该这么写。
第3次执行输出:

The "new" subfolder already exists.


第二次就该这么说。
如何修复命令,使其第一次正确运行?

ego6inou

ego6inou1#

好的。在你的例子中,你贴了 * 四行 *。然而,因为前两行以&&结尾,第四行以ELSE开头(这不是一个有效的命令),我假设你的例子是 * 真的 * 一行...
如果是这样的话,那么你的代码就可以工作了,如果你只是把它分成两行 * 分开 *:

set "folder=C:\Users\%USERNAME%\Desktop\New folder" && set "subfolder=new"
IF exist "%folder%\%subfolder%" ( echo The "%subfolder%" subfolder already exists. ) ELSE ( mkdir "%folder%\%subfolder%" && echo Created the "%subfolder%" subfolder. )

字符串
如果您想知道此更改的原因,那么您应该在此或任何其他与cmd.exe命令相关的站点中搜索“延迟扩展”术语。简要总结如下:
你不能在同一行中定义一个变量并%expand% it。为此,您需要启用延迟扩展,并使用感叹号而不是百分号来扩展同一行中已更改的!variable!值。

7vux5j2d

7vux5j2d2#

可以使用for参数来使用变量的更新值。在下面的代码中,我将文件夹/子文件夹名称缩短为“A”和“B”。

set "folder=A" & set "subfolder=B" & @for /f "tokens=1* delims==" %F in ('set folder') do @if "%F"=="folder" @for /f "tokens=1* delims==" %K in ('set subfolder') do @if "%K"=="subfolder" @if exist "%G\%L" (echo The "%L" Subfolder already exists.) else (mkdir "%G\%L" && echo Created the "%L" subfolder.)

字符串
相同,但现在分为4行,以提高可读性。
注意:下面的代码将失败,代码属于一行可运行!

set "folder=A" & set "subfolder=B" &
 @for /f "tokens=1* delims==" %F in ('set folder') do @if "%F"=="folder"
 @for /f "tokens=1* delims==" %K in ('set subfolder') do @if "%K"=="subfolder"
 @if exist "%G\%L" (echo The "%L" Subfolder already exists.) else (mkdir "%G\%L" && echo Created the "%L" subfolder.)


此代码最接近海报的原始代码。
但是这段代码可以通过省略所有的set/for/if来简化,只用于参数。
rem下一个变体使用forparams括在double quot's中

for %G in ("A") do for %L in ("B") do  @if exist "%~G\%~L" (echo The %L Subfolder already exists.) else (mkdir "%~G\%~L" && echo Created the %L subfolder.)


rem下一个变体使用forparams不包含在双引号中

for /F %G in ("A") do for /F %L in ("B") do  @if exist "%G\%L" (echo The "%L" Subfolder already exists.) else (mkdir "%G\%L" && echo Created the "%L" subfolder.)

相关问题