【问题标题】:Can we run a batch file (.bat) from the shared path我们可以从共享路径运行批处理文件(.bat)吗
【发布时间】:2023-03-14 06:26:01
【问题描述】:

我有一个共享路径(例如 //servername/c$/batches/),我的所有批处理文件都位于该路径现在我正在用 C# 编写一个 Web 应用程序来运行 .bat来自该应用程序的文件。当我有物理路径时,我知道该怎么做。 但是在这里我没有物理路径。有没有可能。

编辑#1

我只需双击它们或打开物理服务器上的 cmd 程序即可执行我的 bat 文件,然后导航到驱动器并执行 bat 文件。

编辑#2

当我输入 UNC 路径时出现以下错误

我收到一个错误 myprogram.exe 不是内部或外部命令可运行程序或批处理文件。 9009

【问题讨论】:

  • 从 UNC 路径运行时会发生什么

标签: c# .net asp.net windows batch-file


【解决方案1】:

批处理文件不支持将 UNC 路径作为其“当前目录”。有一个骇人听闻的解决方法:

pushd "%~dp0"
your batch stuff
popd

%~dp0 扩展为当前的 (d)rive/(p)ath/(0)batchfilename


示例:

好的。一个简单的批处理文件:

pushd %~dp0
echo "Hello from batch land"
echo %~dp0
popd

将它放在服务器上的某个地方,并尝试通过 unc 路径运行它:

C:\> \\server\share\test.bat

你会得到输出:

C:\>pushd \\server\share\

Z:\>echo Hello from batch land
Hello from batch land

Z:\>echo \\server\share\
\\server\share\

Z:\>popd

C:\>

很奇怪,但它有效。

【讨论】:

  • 但是如果共享实际上在不同的服务器上,并且您在本地执行批处理文件,那将不起作用,不是吗?
  • @Christian:这适用于所有情况。 pushd 支持 UNC 路径。
  • 对不起,我坚持不懈,但我不太明白。假设您从本地机器运行\\remote\c$\batches\foo.cmd%~dp0 应该如何扩展?实际路径(在本例中为 c:\batches\foo.cmd)在您的本地机器上不存在,而是 服务器上的非 UNC 路径
  • 我不想修改现有的 bat 文件。但是告诉我我可以用 C# 代码做到这一点
  • 奇怪的是,它创建了一个临时共享挂载(在我的 win7 机器上,它显示为 Z: 驱动器),运行脚本,然后卸载。这让批处理运行在一条 unc 路径上,尽管它仍在分配一个驱动器号。
【解决方案2】:

这称为 UNC 路径
您可以像使用任何其他路径一样使用它。

但是,运行 ASP.Net 代码的用户必须对网络共享具有读取权限。

【讨论】:

  • 即使我通过UNC路径打开bat文件,它只是闪烁,但它没有执行里面的代码。
  • 只是为了补充您的答案:CMD.EXE 不支持将 UNC 路径作为“当前目录”,因此 cd \\whatever\.. 在批处理文件中不起作用。
  • @Praneeth:您遇到了当前目录问题。您需要修复 .bat 文件,以便它在不同的当前目录中工作。
  • @Chrisitan,我同意你的看法。现在如何使它适用于我的情况?
  • 我拥有所有访问权限,查看当前目录没有问题
【解决方案3】:

显然,您确实遇到了当前目录问题。
.bat 文件正在尝试从当前目录运行 myprogram.exe

您可以在本地计算机上创建一个包装批处理文件来映射网络共享:

pushd \\server\c$\dir
call filename.bat
popd

您可以将此包装文件放在任何地方,然后从您的代码中调用它。

【讨论】:

  • 是的​​​​​​​​​​​​​您需要了解原因;你不应该只是盲目地这样做。
  • 它可以工作,但会引发一些内部异常......它仍然在代码中存在一些依赖项
猜你喜欢
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多