1 回答

TA貢獻1802條經驗 獲得超5個贊
主要問題是將Sysinternals Suite安裝到%SystemRoot%\System32
. 這不是一個好的決定,并導致了這里的問題。
該目錄%SystemRoot%\System32
適用于在 64 位 Windows 上的 64 位環境中執行的 64 位應用程序。
在 32 位環境中使用通常擴展為%SystemRoot%\System32
的會導致 Windows文件系統重定向器重定向到分別擴展的 .C:\Windows\System32
%SystemRoot%\SysWOW64
C:\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.exe
SysinternalsSuite
特殊重定向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 關注
- 169 瀏覽
添加回答
舉報