批处理文件:如何检查%~dp0是否为UNC网络路径?

3

我看到了 如何在网络共享中运行批处理文件而不出现“UNC path are not supported”消息? - 使用 pushd %~dp0 将网络路径挂载为驱动器,使用 popd 卸载驱动器,对我有效。

我想让批处理脚本能够检测启动脚本的位置是本地路径还是网络/UNC路径。我该如何实现?我猜,可以检查路径中前两个字符是否为反斜杠 \\,但我不知道如何在批处理中实现。

因此,作为一种伪代码,我需要类似于:

call :IsUncPath %~dp0 is_unc_path

if %is_unc_path% == 1 (
  echo "Mounting UNC path as local drive"
  REM @pushd %~dp0
)

echo "Script does whatever here..."

if %is_unc_path% == 1 (
  echo "Unmounting local drive for UNC path"
  REM @popd
)

pause
:: "force execution to quit at the end of the "main" logic" http://steve-jansen.github.io/guides/windows-batch-scripting/part-7-functions.html
EXIT /B %ERRORLEVEL%

:IsUncPath
echo The value of parameter 1 is %~1
:: NB: there must not be spaces around the assignment!
set "%~2=1"
EXIT /B 0

好的,为什么你想这样做呢?因为本地路径保持不变,远程路径被挂载到本地驱动器上,所以你可以使用 pushd/popd 命令来处理所有路径。 - aschipfl
2个回答

2
您可以使用 net use <驱动器号> 命令的错误级别。
call :isUncPath C:
if %errorlevel% == 0 echo C: is on UNC
exit /b

:IsUncPath
::: param1 - drive letter with colon, ex Y:
::: @return exitcode 0 - drive is network mapped
net use %~1 >nul 2>&1
EXIT /B %errorlevel%

非常感谢,看起来很不错!但是,我真的不知道如何从批处理函数中读取返回错误代码 - 你介意告诉我如何读取返回的错误状态,并将其放入变量中吗?(以及我应该检查什么值来确定这确实是网络路径?是 returncode != 0 吗?) - sdbbs
1
@sdbbs 我编辑了我的答案,展示了错误级别的使用。 - jeb

1

你也可以使用这个:

@echo off
call :chkunc
if %errorlevel% equ 0 echo "%~dp0" is on UNC 
:: rest of your script
exit /b
:chkunc
set "testpath=%~dp0"
if "%testpath:~0,2%"=="\\" exit /b 0
exit /b 1

please test before posting. - Stephan
我现在正在使用手机运行,为什么它不起作用?UNC路径始终以\开头。 - Wasif
我已经编辑过代码。我在if /?里看到了if errorlevel语法。 - Wasif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接