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版本一致?
编辑:为显示我如何到达的问题添加背景(在顶部)(+次要更正)
经过一些API监控,这就是我所看到的
将文件放在.exe文件上时,explorer.exe使用CreateProcessAPI函数启动进程,将可执行文件作为lpApplicationName,将可执行文件和删除文件作为lpCommandLine.的lpCurrentDirectory是在函数调用由呼叫者过程设置为包含拖放的文件的文件夹[1] .
当您将文件放在.cmd文件上时,它explorer.exe也使用CreateProcessAPI,但在这种情况下,lpApplicationNameis null和lplCommandLine包含批处理文件和删除的文件.lpCurrentDirectory也设置为删除文件[1]的父文件夹.
当您将文件放在.vbs文件上时,ShellExecuteEx使用lpDirectory该SHELLEXECUTEINFO结构的字段null,因此,创建的进程将继承父进程的当前活动目录.默认情况下,explorer.exe进程的当前活动目录是%systemroot%\system32,但是可以explorer使用将在此类删除操作中继承的不同当前活动目录启动实例.
[1]如果我们删除多个文件,则使用作为第一个参数传递的文件的路径
请注意仅供参考:测试活动目录继承后面的过程是:
cmd实例并将当前活动目录更改为c:\tempexplorer.exe实例cmd实例调用explorer.exe.此explorer实例将cmd窗口中的活动目录作为其当前活动目录.| 归档时间: |
|
| 查看次数: |
1093 次 |
| 最近记录: |