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

Wol*_*olf 2 windows vbscript drag-and-drop batch-file working-directory

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

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

这是我的实际问题:

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

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

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

my.vbs %*
Run Code Online (Sandbox Code Playgroud)

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

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


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

MC *_* ND 5

经过一些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窗口中的活动目录作为其当前活动目录.