1 回答
TA贡献1802条经验 获得超5个赞
主要问题是将Sysinternals Suite安装到%SystemRoot%\System32. 这不是一个好的决定,并导致了这里的问题。
该目录%SystemRoot%\System32适用于在 64 位 Windows 上的 64 位环境中执行的 64 位应用程序。
在 32 位环境中使用通常扩展为%SystemRoot%\System32的会导致 Windows文件系统重定向器重定向到分别扩展的 .C:\Windows\System32%SystemRoot%\SysWOW64C:\Windows\SysWOW64
%SystemRoot%\SysWOW64包含 32 位系统可执行文件,但不SysinternalsSuite包含 file的目录PsExec.exe。
python.exe是一个 32 位的可执行文件。出于这个原因,仅cmd在 Python 脚本%SystemRoot%\SysWOW64\cmd.exe中启动,该脚本是 32 位版本的 Windows 命令处理器。32 位cmd找不到C:\Windows\SysWOW64\SysinternalsSuite\PsExec.exe,所以psexec.exe根本不执行。
好吧,根本不需要开始cmd.exe运行一个只包含一个命令行的批处理文件,以psexec.exe在 32 位环境下以错误的路径运行。
在 Python 脚本中使用就足够了:
$args = '\\\\server -i -u "****" -p "****" "C:\\directory\\sub\\test.bat"';exec('C:\\Windows\\Sysnative\\SysinternalsSuite\\PsExec.exe '.$args.);32 位使用此代码在64 位 Windows 系统目录的子目录中使用适当的参数python.exe运行 32 位可执行文件。PsExec.exeSysinternalsSuite
特殊重定向Sysnative仅适用于在 32 位环境中执行的 32 位应用程序。请注意,Sysnative它既不是目录也不是符号链接或硬链接。文件系统不包含Sysnative目录中的条目C:\Windows。由于这个原因,不可能在批处理文件中使用,if exist %SystemRoot%\Sysnative或者if exist %SystemRoot%\Sysnative\因为这两个条件总是评估为假。但if exist %SystemRoot%\Sysnative\cmd.exe可以在批处理文件中使用,以确定批处理文件是否在 64 位 Windows 上由 32 位 Windows 命令处理器处理,因为在此用例中条件评估为真。
我还建议阅读 Microsoft 文档页面WOW64 Implementation Details and Registry Keys Affected by WOW64,以了解 32 位 Windows 仿真如何在 64 位 Windows 上工作。
一个小问题是附加&在 Windows 命令行的末尾。shell 脚本行末尾的 & 符号仅由 Unix/Linux/Mac shell 脚本解释器解释为在后台运行分离的可执行文件的指令。因此,shell 脚本解释器不会在脚本继续之前或用户可以输入下一个要执行的命令之前等待已启动的可执行文件终止。
Windows 命令处理器cmd.exe将双引号参数字符串之外的 & 符号解释为AND运算符,通常用于在一个命令行上指定多个命令,请参见使用 Windows 批处理文件的单行多命令。如果在&由 解释的命令行上什么都没有cmd.exe,Windows 命令处理器将忽略AND运算符。
因此,不要&在 Windows 命令行上附加。
命令行的批处理文件中还有两个小问题:
"C:/Windows/System32/SysinternalsSuite/PsExec.exe" \\server -i -u **** -p **** c:\\directory\\sub\\test.bat
Windows 上的目录分隔符\与/Microsoft 在文档页面Naming Files, Paths, and Namespaces中的解释不同。在将字符串传递给适当的文件系统函数之前,Windows 内核默认替换文件/文件夹字符串中的 all /by 。\但是 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 上主要用于选项的开头。
在批处理文件中,两个目录名之间以及目录名和文件名之间的用法\\也总是错误的,必须由 Windows 内核纠正,然后才能通过删除一个反斜杠将文件/文件夹名称字符串传递给文件系统。\\仅在UNC 路径的开头有效。
- 1 回答
- 0 关注
- 230 浏览
添加回答
举报
