如何检测Windows网络路径?

brvekthn  于 2023-05-19  发布在  Windows
关注(0)|答案(3)|浏览(239)

我正在编写一个脚本,它运行一个Windows可执行文件在一个目录中提供的用户。如果此脚本是一个网络路径,将其设置为当前目录看起来是有效的,但在此目录中运行任何命令都将失败:

>>> import os
>>> os.chdir(r'\\server\share\folder') # my actual name is different but similar
>>> os.getcwd()
'\\\\server\\share\\folder'
>>> os.system('echo %CD%')
'\\server\share\folder'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory.
C:\Windows
0

我想在我的脚本中预测这种情况-如果用户提供网络路径而不是像c:\work\project42这样的本地路径,立即给予一个有意义的错误,而不是让它稍后失败。
如何确定路径是否为Windows网络路径?

y1aodyip

y1aodyip1#

我的意思是,在你的例子中,一个简单的yourpathstring.startswith(r('\\'))似乎是合适的,但是:
Windows路径系统非常强大,您无法分辨某个东西是否是实际上是网络挂载(“网络驱动器”风格)的经典DOS/Win 9 x时代本地路径,或者某个东西是否是从遍历路径层次结构的替代方式开始的本地路径。比较getFullPathname函数的复杂度。
换句话说,仅从路径来看,即使是Windows也无法直接告诉您某个东西是本地的还是远程的。
因此,解决方案就是不使用CMD来处理可能是UNC路径的路径(问题在于路径,而不是它的网络性)。快进30年,使用不同的shell/脚本解释器(powershell,VB.NET,...)

drnojrws

drnojrws2#

您希望检测UNC路径。
您可以简单地执行以下操作:

r'\\server\share\folder'.startswith(os.sep*2)

要解决这个问题,最好避免完全更改目录,并在可能的情况下调整调用的程序参数,以便命令在当前(有效)目录中运行。
另一种解决方法是使用net use命令挂载驱动器(基本上是pushdpopd命令所做的,参见Browse an UNC path using Windows CMD without mapping it to a network drive)。
然后Windows接受启动该目录中的进程。
如果您是系统管理员,您也可以通过设置以下注册表项来禁用unc检查:HKLM\SOFTWARE\Microsoft\Command Processor\DisableUNCCheck,但代码将依赖于该键,这在机器上很少是默认的。

envsm3lx

envsm3lx3#

我同意最简单的检查是yourpathstring.startswith(r'\\')
然而,对于任何以\\开头的linux路径,这将是一个假阳性(不太可能,但可能),当人们使用正斜杠时,这将是一个假阴性://server\share\folder
看来库函数splitdrive在设计时考虑了网络路径支持。网络部分被认为是“驱动器”,所以只需检查它是否是非DOS驱动器:

def is_network_path(path):
    drive = os.path.splitdrive(path)[0]
    if drive:
        return not drive.endswith(':')
    else:
        return False

可能不值得努力,但它“感觉”更正确。

相关问题