版本:Windows 10 x64 1909(西班牙語)|內部版本:18363.959
根據 Microsoft 的說法,該元素的限制CommandLine
是 1024 個字符,但在我的測試中,當它超過 200 個字符時,它開始表現得很奇怪。考慮到在元件Path
中調用相同的元素,Microsoft-Windows-Deployment
我猜測文檔是錯誤的,並且兩個元素的實際限制是 259 個字元。
資料來源:
如何重現:
在oobeSystem
傳遞中,將這些添加到以下位置FirstLogonCommands
:
<SynchronousCommand wcm:action="add">
<Order>1</Order>
<Description>Test</Description>
<CommandLine>reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v Test1 /t REG_SZ /d "cmd /k echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" /f</CommandLine>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<Order>2</Order>
<Description>Test</Description>
<CommandLine>reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v Test2 /t REG_SZ /d "cmd /k echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" /f</CommandLine>
</SynchronousCommand>
命令 1 已正確新增至註冊表並執行:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
Test1 REG_SZ cmd /k echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
但命令 2 按字面意思新增HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
Unattend0000000002{373CFC84-60AF-44A4-A316-9BECBAB1AD4B} REG_EXPAND_SZ reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v Test2 /t REG_SZ /d "cmd /k echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" /f
C:\Windows\Panther\UnattendedGC\setupact.log
沒有顯示任何異常:
2020-08-17 19:09:39, Info [Shell Unattend] LogonCommands: Set command 'reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v Test1 /t REG_SZ /d "cmd /k echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" /f'
2020-08-17 19:09:39, Info [Shell Unattend] LogonCommands: Set command 'reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v Test2 /t REG_SZ /d "cmd /k echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" /f'
答案1
最近我遇到了同樣的問題,正如您所猜測的,我將限制確定為 259 個字元。但是,我認為 - 如果命令行中包含百分比變數 - 變數擴展可以改變有效限制。但不幸的是,我的測試在這方面並沒有得出任何明確的結論。
以下簡單測試示範了 259 個字元的限制:
<SynchronousCommand wcm:action="add">
<Order>1</Order>
<RequiresUserInput>false</RequiresUserInput>
<CommandLine>cmd /c ECHO This line will eventually be 259 characters long. This line will eventually be 259 characters long. This line will eventually be 259 characters long. This line will eventually be 259 characters long. This line will even > "C:\Windows\Temp\259.log"</CommandLine>
<Description>259 characters, should produce file</Description>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<Order>2</Order>
<RequiresUserInput>false</RequiresUserInput>
<CommandLine>cmd /c ECHO This line will eventually be 260 characters long. This line will eventually be 260 characters long. This line will eventually be 260 characters long. This line will eventually be 260 characters long. This line will event > "C:\Windows\Temp\260.log"</CommandLine>
<Description>260 characters, should NOT produce file</Description>
</SynchronousCommand>
簡而言之:<CommandLine>
259個字元長並嘗試寫入名為的檔案的行259.log
已成功寫入,而<CommandLine>
260個字元長並嘗試寫入名為的檔案的行260.log
則未成功寫入。
我第一次遇到這個問題時,我正在對各種 Windows 安裝後命令調用的命令列進行一些更改。具體來說,我的更改是完全限定文件的路徑.exe
,並在某些情況下使用環境變量,例如"%ComSpec%"
而不是cmd
.但透過增加字元數,我無意中破壞了東西!
令人費解的是,<CommandLine>
長度小於 260 個字元的行仍然導致無法完成其應有的任務。我知道這些命令是正確的,因為在沒有完全限定文件的情況下.exe
,它們就可以工作。以下是<CommandLine>
失敗的 253 個字元的範例行:
<SynchronousCommand wcm:action="add">
<Order>3</Order>
<RequiresUserInput>false</RequiresUserInput>
<CommandLine>"%ComSpec%" /c FOR %I IN ("%InstallDrive%:\cfs-extras\installers\LibreOffice_*.msi") DO IF NOT DEFINED L "%WinDir%\System32\msiexec.exe" /i "%~fI" /l* "%TMP%\L.log" /qn ALLUSERS=1 CREATEDESKTOPLINK=1 QUICKSTART=1 ADDLOCAL=ALL UI_LANGS=en_GB ^&^& SET L=t</CommandLine>
<Description>Silently install LibreOffice</Description>
</SynchronousCommand>
但是,如果我手動擴展變量,那麼我的命令確實超出了 259 個字元的限制!這可能表明在運行命令之前正在進行一些變數的預擴展。
另一個觀察:我嘗試跑步普羅克蒙,過濾例如進程名稱 = cmd.exe
,我發現cmd.exe
失敗的命令從未出現在 Procmon 輸出中。
正如您所發現的,我還發現C:\Windows\Panther\UnattendedGC\setupact.log
報告命令運行成功,無論它是否成功。
讀完您關於從 USB 記憶棒運行的評論後,聽起來您正在做的事情與我非常相似。對我有幫助的一件事是為 USB 驅動器盤符設定一個環境變數。希望這將允許您以用戶身份調用腳本,而不是長命令行yagmoth555♦評論道。我在以下部分中進行了設定<settings pass="specialize">
:
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"
xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RunSynchronous>
<RunSynchronousCommand wcm:action="add">
<Order>1</Order>
<Description>Set InstallDrive environment variable</Description>
<Path>"%ComSpec%" /c FOR %i IN (C D E F G H I J K L N M O P Q R S T U V W X Y Z) DO IF NOT DEFINED InstallDrive IF EXIST %i:\cfs-extras "%SystemRoot%\System32\setx.exe" InstallDrive %i /M</Path>
</RunSynchronousCommand>
</RunSynchronous>
</component>
這只是檢查每個磁碟機是否存在已知存在於 USB 記憶棒上的目錄,如果存在,它將InstallDrive
環境變數設定為具有該目錄的磁碟機的磁碟機號。然後您可以%InstallDrive%
稍後在<settings pass="oobeSystem">
命令/腳本中引用。在本節末尾,我使用以下命令刪除環境變數:
<SynchronousCommand wcm:action="add">
<Order>7</Order>
<RequiresUserInput>false</RequiresUserInput>
<CommandLine>"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -command [Environment]::SetEnvironmentVariable('InstallDrive',$null,'Machine')</CommandLine>
<Description>Remove InstallDrive machine environment variable. Always run this last.</Description>
</SynchronousCommand>
……只是為了保持東西乾淨整潔。
我知道您提出問題已有四年了,但我希望這個答案對您以及可能面臨相同問題的其他人仍然具有一定的相關性。