Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 要在对称文件夹结构之间移动的批处理文件_Windows_Batch File_Cmd_Command Prompt - Fatal编程技术网

Windows 要在对称文件夹结构之间移动的批处理文件

Windows 要在对称文件夹结构之间移动的批处理文件,windows,batch-file,cmd,command-prompt,Windows,Batch File,Cmd,Command Prompt,我在一个对称文件夹结构的项目中工作,即: 主人 折叠1 文件夹_A1 折叠2 折页3 奴隶 折叠1 文件夹_A1 折叠2 折页3 当我工作时,我通常在主目录和从目录之间切换到相同的目录。我想创建一个批处理文件,帮助我只切换maste/slave目录,我想这样: C:\Project\Master\Folder1\FolderA1>BatchFile C:\Project\Slave\Folder1\FolderA1> 我计划创建两个批处理,toMaster和to

我在一个对称文件夹结构的项目中工作,即:

  • 主人
    • 折叠1
      • 文件夹_A1
    • 折叠2
    • 折页3
  • 奴隶
    • 折叠1
      • 文件夹_A1
    • 折叠2
    • 折页3
当我工作时,我通常在主目录和从目录之间切换到相同的目录。我想创建一个批处理文件,帮助我只切换maste/slave目录,我想这样:

C:\Project\Master\Folder1\FolderA1>BatchFile
C:\Project\Slave\Folder1\FolderA1>
我计划创建两个批处理,toMaster和toSlave,它们获取当前目录并用“Slave”替换“Master”字符串,然后移动到该目录。以下是到目前为止我在toSlave批次中得到的信息:

@echo OFF
setlocal ENABLEDELAYEDEXPANSION
set word=Slave
set "str=%cd%"
echo %str%
set str=%str:Master=!word!%
echo %str%    
pushd %str%
这似乎正确地替换了字符串,但当我从终端运行它时,它不会更改我当前的目录。有什么想法吗


谢谢

你的方法不起作用,因为你做了一个
setlocal
。当批处理文件结束时,将执行隐式
endlocal
,从而撤消
pushd
。还有另一个不应该使用pushd的原因:它会将当前位置保存在堆栈上,如果使用太频繁,可能会导致堆栈溢出。最好改用
cd

您的批处理文件超载严重。大多数行是不需要的,其余的只需一个命令即可完成

toSlave.bat
只需:

@cd /d "%__cd__:\Master\=\Slave\%"

(或者你使用@Compo的“切换”方法。这很优雅,但是你的工作就是验证你是否在正确的文件夹中)

cd%str%
而不是
pushd%str%
工作?将
设置“str=!str:Master=%word%”而不是
Set str=%Master=!字!%工作?Renat,它似乎只在批处理文件执行的上下文中工作。当我运行
echo%cd%
时,在运行
cd%str%
之后,目录将显示在SLAVE中,但是一旦执行完成,我再次出现在提示符中,终端中的cd将在主路由复合中显示我自己,如果我切换您建议的行,同样的情况也会发生,字符串被正确替换,但当批处理文件中的更改目录结束执行后,提示中的当前目录就是我启动的原始目录。您当然可以忘记设置变量,尝试一个单行命令,
@If/i“%\uuuuuu CD\uuuuu%”==“%\uuuu CD\uuuu:\Master\=”(CD“%\\\\\\\\\\\\\\\\\\\%\”),否则如果/I“%\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>,这当然将是一个单独的批处理文件,而不是使用两个(它将有效地在两个目录树之间切换)。然后,您可以从任何批处理文件调用它,根据需要将当前目录切换到另一个目录树。Stephan,我不确定您所说的“验证您是否在正确的文件夹中是您的工作”是什么意思,请参阅我的“切换”“方法。尽管当前答案也是如此,但它不会更改树,除非它们的当前目录路径包含
\slave\
\master\
,并且存在包含其他关键字的匹配目录树(我省略了StdErr重定向,以便最终用户知道这样的失败)。关于您当前的答案,请注意,由于驱动器没有变化,因此不需要包含
/D
选项。
/D
在此处不是必需的,但也不会造成伤害-最好注意安全。“您的工作是验证”我的意思是,如果您执行
toSlave
,您将在
从属分支中结束,而与您之前所在的分支无关。使用切换方法时,您需要确定您的位置/结束位置。有关信息,我在我的注释选项中使用了
%\uuuuu CD\uuuuuuu%
,而不是
%CD%
,因为替换字符串以尾随反斜杠结束
%\uuuu CD\uuuuu%
将始终带有一个尾随的反斜杠,这意味着如果当前目录是
C:\Project\Master
,(
%\uuuu CD\uuuuuuuu%
=
C:\Project\Master\
),或者
C:\Project\Slave
,(
%\uuuuu CD\uuuuuuuuuuu%
=
C:\Project\Slave>)。我还认为我现在已经明白了你关于“你在哪里/你在哪里结束”的观点(脚本在调用时可能不在任何主分支或从分支中)。@Compo关于
%cd%
和未记录的
%\uuuuuuuucd%
之间的区别,你是对的。我相应地修改了答案。谢谢,这真的很有帮助。这两种解决方案对我都有效!你让我的生活更轻松了