为什么远程批处理文件不是由PsExec执行的,而是从一个包含exec函数的PHP脚本中运行的批处理文件开始的?

为什么远程批处理文件不是由PsExec执行的,而是从一个包含exec函数的PHP脚本中运行的批处理文件开始的?,php,windows,batch-file,server,remote-server,Php,Windows,Batch File,Server,Remote Server,我目前面临的问题是,我想实现一个PHP脚本,在远程服务器上启动一个批处理文件 经过几个小时的思考,我找到了最接近的解决方案,那就是在本地服务器上创建一个批处理文件,该文件可以由PHP脚本启动。但是,当通过PHP脚本启动时,批处理文件不会启动远程批处理文件 如果双击本地启动批处理文件c:\directoryapps\sub\classes\actions\test.bat,则远程批处理文件c:\directory\sub\test.bat通过PsExec执行时不会出现问题 根据需要授予权限 我在P

我目前面临的问题是,我想实现一个PHP脚本,在远程服务器上启动一个批处理文件

经过几个小时的思考,我找到了最接近的解决方案,那就是在本地服务器上创建一个批处理文件,该文件可以由PHP脚本启动。但是,当通过PHP脚本启动时,批处理文件不会启动远程批处理文件

如果双击本地启动批处理文件
c:\directoryapps\sub\classes\actions\test.bat
,则远程批处理文件
c:\directory\sub\test.bat
通过
PsExec
执行时不会出现问题

根据需要授予权限

我在PHP中使用以下代码启动第一批文件:

$cmd = '"c:\\directoryapps\\sub\\classes\\actions\\test.bat"';
exec('cmd /c '.$cmd.' &');
该批处理文件的代码如下所示:

"C:/Windows/System32/SysinternalsSuite/PsExec.exe" \\server -i -u **** -p **** c:\\directory\\sub\\test.bat 
我如何实现此的工作版本


我还尝试从PHP脚本中运行第一批文件代码,但没有成功。

主要问题是决定将Sysinternals套件安装到
%SystemRoot%\System32
的子目录中。这不是一个好决定,导致了这里的问题

目录
%SystemRoot%\System32
用于在64位Windows上的64位环境中执行的64位应用程序

在32位环境中使用
%SystemRoot%\System32
(通常扩展到
C:\Windows\System32
)会导致Windows重定向到
%SystemRoot%\SysWOW64
,分别扩展到
C:\Windows\SysWOW64

%SystemRoot%\SysWOW64
包含32位系统可执行文件,但不包含包含文件
PsExec.exe的目录
SysinternalsSuite

python.exe
是32位可执行文件。因此,在Python脚本
%SystemRoot%\SysWOW64\cmd.exe
中,仅使用
cmd
启动,这是Windows命令处理器的32位版本。32位
cmd
无法找到
C:\Windows\SysWOW64\SysinternalsSuite\PsExec.exe
,因此根本不执行
PsExec.exe

好的,启动
cmd.exe
来运行一个批处理文件,该批处理文件只包含一个用于在32位环境中以错误路径运行
psexec.exe

在Python脚本中使用就足够了:

$args = '\\\\server -i -u "****" -p "****" "C:\\directory\\sub\\test.bat"';
exec('C:\\Windows\\Sysnative\\SysinternalsSuite\\PsExec.exe '.$args.);
32位
python.exe
与此代码一起运行64位Windows系统目录的子目录
SysinternalsSuite
中带有适当参数的32位可执行文件
PsExec.exe

特殊重定向
Sysnative
仅适用于在32位环境中执行的32位应用程序。请注意,
Sysnative
既不是目录,也不是符号链接或硬链接。文件系统在目录
C:\Windows
中不包含条目
Sysnative
。因此,如果存在%SystemRoot%\Sysnative
如果存在%SystemRoot%\Sysnative\
,则无法在批处理文件
中使用,因为这两个条件的计算结果始终为false。但是
如果存在%SystemRoot%\Sysnative\cmd.exe
可以在批处理文件中使用,以确定批处理文件是否由64位Windows上的32位Windows命令处理器处理,因为在本用例中,条件的计算结果为true

我还建议您阅读Microsoft文档页面,了解32位Windows仿真如何在64位Windows上工作


一个小问题是在Windows命令行末尾追加
&
。shell脚本行末尾的符号仅由Unix/Linux/Mac shell脚本解释器解释为在后台运行可执行文件的指令。因此,shell脚本解释器不会在脚本继续之前或在用户输入下一个要执行的命令之前等待已启动的可执行文件的终止

Windows命令处理程序
cmd.exe
将双引号参数字符串外的与符号解释为运算符,通常用于在一个命令行上指定多个命令,请参阅。如果由
cmd.exe
解释的命令行上没有任何内容,Windows命令处理器将忽略运算符

因此,不要在Windows命令行上追加
&


命令行上的批处理文件中还有两个小问题:

"C:/Windows/System32/SysinternalsSuite/PsExec.exe" \\server -i -u **** -p **** c:\\directory\\sub\\test.bat
Windows上的目录分隔符是
\
,而不是Microsoft在文档页上解释的
/
。默认情况下,Windows内核会将文件/文件夹字符串中的所有
/
替换为
\
,然后再将该字符串传递给相应的文件系统函数。但是,使用Linux/Mac目录分隔符
/
仍可能导致意外行为

例如:

在Windows命令提示符窗口中运行:

for %I in (C:/Windows/*.exe) do @echo %I
在Windows目录中找到的可执行文件以
C:
和不带路径的文件名输出。因此,分配给循环变量
I
的是一个字符串,它引用驱动器
C:
当前目录中的可执行文件。但是,执行此命令行时驱动器
C:
上的当前目录很可能不是
C:\Windows
,这将导致实际处理分配给循环变量
I
的文件名时出现问题,而不只是将其打印到控制台窗口

立即在同一命令提示窗口中运行:

for %I in (C:\Windows\*.exe) do @echo %I
输出的文件名与以前相同,但这次是完整路径

结论:不要在Windows上的文件/文件夹字符串中使用
/
,请依赖Windows内核的自动更正<代码>/
在Windows上主要用于选项的开头

在批处理文件中,在两个目录名之间以及在一个目录名与另一个目录名之间使用
\\
?