热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

通过拖放操作调用的vbscript中的当前工作目录

如何解决《通过拖放操作调用的vbscript中的当前工作目录》经验,为你挑选了1个好方法。

当我试图获得我的批处理脚本的提升权限时,我发现了两个相关的SO问题

如何在批处理文件中请求管理员访问权限

如何自动提升我的批处理文件,以便在需要时从UAC管理员权限请求?

......这导致了部分解决的问题.出于某种原因,我遇到了在VBS脚本中包含空格的文件路径参数的命令行传递问题,所以我试图将解决方案分成3部分并集中在内部(VBS)步骤,然后通过调用a添加最后一步尽管与VBS脚本位于同一文件夹中,但无法找到该VBS中的批处理.我发现,拖放不是"那么简单" 它使用时的不同.vbs,而不是.bat.exe用作放置目标.

这是我的实际问题:

如果我拖动文件并将其拖放到可执行文件(exe)或批处理文件(bat,cmd)上,则当前工作目录由拖动项目的来源确定.其目录设置为处理它的程序或脚本的工作目录.

如果我将文件放到VBS脚本上,则会有所不同.在Windows 8.1 x64上,C:\Windows\System32即使参数与VBS位于同一文件夹中,我也会观察到它.

我可以简单地使用这样的批处理文件(如拖放中继)

my.vbs %*

获得"正常" .bat行为(drop source指示CWD),但我也想了解它.

这是一个错误还是一个功能?它是否与所有Windows版本一致?


编辑:为显示我如何到达的问题添加背景(在顶部)(+次要更正)



1> MC ND..:

经过一些API监控,这就是我所看到的

将文件放在.exe文件上时,explorer.exe使用CreateProcessAPI函数启动进程,将可执行文件作为lpApplicationName,将可执行文件和删除文件作为lpCommandLine.的lpCurrentDirectory是在函数调用由呼叫者过程设置为包含拖放的文件的文件夹[1] .

当您将文件放在.cmd文件上时,它explorer.exe也使用CreateProcessAPI,但在这种情况下,lpApplicationNameis nulllplCommandLine包含批处理文件和删除的文件.lpCurrentDirectory也设置为删除文件[1]的父文件夹.

当您将文件放在.vbs文件上时,ShellExecuteEx使用lpDirectorySHELLEXECUTEINFO结构的字段null,因此,创建的进程将继承父进程的当前活动目录.默认情况下,explorer.exe进程的当前活动目录是%systemroot%\system32,但是可以explorer使用将在此类删除操作中继承的不同当前活动目录启动实例.

[1]如果我们删除多个文件,则使用作为第一个参数传递的文件的路径

请注意仅供参考:测试活动目录继承后面的过程是:

打开cmd实例并将当前活动目录更改为c:\temp

杀死所有explorer.exe实例

cmd实例调用explorer.exe.此explorer实例将cmd窗口中的活动目录作为其当前活动目录.


推荐阅读
author-avatar
mobiledu2502911415
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有