我正在创建一个简单的命令行备份脚本,以使用 robocopy 将“重要”内容镜像到我的 NAS 盒。我不想依赖该 NAS 盒的硬编码映射驱动器号。在脚本中,我想映射一个临时驱动器号,复制相关文件,并处理映射的驱动器。我不想假设如果该驱动器号已经映射,它指向我期望的位置。我也不想在映射驱动器时“假设”某个驱动器号可用,因此以“*”开头。
net use * \\nasbox\sharename 密码 /user:用户名 /persistent:no
在我的 .bat 脚本中,提取驱动器号以供后续命令使用的正确方法是什么?我在想我可以将“for”的标记解析的一些变体拼凑在一起,但我还怀疑一定有比深奥的 for 语法更简单的方法。
C:\>net use * \\nasbox\sharename 密码 /user:用户名 /persistent:no 驱动器 Z:现已连接到 \\nasbox\sharename。 命令已成功完成。 目录:\>
一旦我有了映射的驱动器号,我就会按照以下命令进行操作:
robocopy C:\path\to\important\stuff %NewDrive%\path\to\backup /MIR /Z
答案1
使用命令pushd
和popd
。
pushd \\server\share
将创建一个临时驱动器(从 Z: 开始并向后查找直到找到可用字母)并进入该驱动器。完成后,popd
将删除临时驱动器并返回到原来的位置。
C:\Users\Snark>pushd /?
Stores the current directory for use by the POPD command, then
changes to the specified directory.
PUSHD [path | ..]
path Specifies the directory to make the current directory.
If Command Extensions are enabled the PUSHD command accepts
network paths in addition to the normal drive letter and path.
If a network path is specified, PUSHD will create a temporary
drive letter that points to that specified network resource and
then change the current drive and directory, using the newly
defined drive letter. Temporary drive letters are allocated from
Z: on down, using the first unused drive letter found.
C:\Users\Snark>popd /?
Changes to the directory stored by the PUSHD command.
POPD
If Command Extensions are enabled the POPD command will delete
any temporary drive letter created by PUSHD when you POPD that
drive off the pushed directory stack.
答案2
为了方便后人理解,下面是这一切如何运作的粗略模板。再次感谢@Snark 和@Neal。
这是我的原始模板,使用 pushd/popd。
@echo 关闭 :: 提供 NAS 共享的凭证。 net use \\nasbox\sharename 密码 /user:用户名 /persistent:no :: 确保其能正常工作。 如果 ERRORLEVEL 1 则回显 NET USE 返回 %ERRORLEVEL% && 转到 :EOF :: 使用 pushd 为共享提供驱动器号。 pushd \\nasbox\共享名 :: 复制要备份的文件。重复上述步骤。 robocopy C:\path\to\important\stuff.\path\to\backups /MIR /Z :: 释放临时驱动器号。 弹出 :: 可选地,在共享未被使用时撤销凭据。 网络使用 \\nasbox\共享名/delete
请注意,根据@Neal 评论的启示,我在这里不需要特别应用 pushd/popd,robocopy 命令的形式只需更改为:
robocopy C:\path\to\important\stuff \\nasbox\sharename\path\to\backups /MIR /Z
无需对此投赞成票。只是想在这里将其作为面包屑,供以后发现此内容的其他人参考。
答案3
尝试这个批处理脚本:
@ECHO OFF
setlocal EnableDelayedExpansion
SET CYBID=
> message1.vbs ECHO WScript.Echo InputBox( "Enter your Elevated Domain ID", "CyberArk ID", "USERID" )
FOR /F "tokens=*" %%A IN ('CSCRIPT.EXE //NoLogo message1.vbs') DO (
SET CYBID=%%A
)
setlocal DisableDelayedExpansion
SET CYBPW=
> message2.vbs ECHO WScript.Echo InputBox( "Enter your Password. The last password you used is displayed. If it is more than a day old, you will need a new value from CyberArk", "CyberArk Pw", "PASSWORD" )
FOR /F "tokens=*" %%B IN ('CSCRIPT.EXE //NoLogo message2.vbs') DO (
SET "CYBPW=%%B"
)
SET MPATH=
> message3.vbs ECHO WScript.Echo InputBox( "Enter your \\server\share", "Enter Share", "\\" )
FOR /F "tokens=*" %%C IN ('CSCRIPT.EXE //NoLogo message3.vbs') DO (
SET MPATH=%%C
)
setlocal EnableDelayedExpansion
net use * !MPATH! !CYBPW! /user:!CYBID! > OUTPUT.txt
FOR /F "tokens=2 eol=T" %%D IN (OUTPUT.txt) DO (
SET MDRIVE=%%D
)
explorer !MDRIVE!
:END
DEL message*.vbs
DEL OUTPUT.txt
答案4
使用这是一个 .cmd 文件
rem path:
echo %CD%
rem drive with slash
echo %CD:~0,3%
rem drive with colon only
echo %CD:~0,2%
CD 是当前驱动器号和路径。
%CD:~0,3%
将是前三个字母(带斜杠的驱动器号),如N:\
,%CD:~0,2%
将仅为驱动器号和冒号,如:N:
因此,如果你在 cmd 文件中使用它,你将获得从 UNC 路径映射的驱动器
pushd \\myunc\sharename\folder\folder\folder
rem path with mapped letter Example Y:\folder\folder\folder
echo %CD%
rem drive with slash
echo %CD:~0,3%
rem drive with colon only
echo %CD:~0,2%
popd