
我正在嘗試運行下面的 powershell 腳本來識別連接到電腦的 USB 或 SCSI 介面類型,如果我不使用IF
和-Or
運算符,該腳本可以正常工作
if(($diskdrive = (gwmi win32_diskdrive | ?{$_.interfacetype -eq 'USB'})) -Or ($diskdrive =(gwmi win32_diskdrive | ?{$_.interfacetype -eq 'SCSI'}))){
$letters = $diskdrive | %{gwmi -Query "ASSOCIATORS OF
{Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE
AssocClass = Win32_DiskDriveToDiskPartition"} | %{gwmi -Query "ASSOCIATORS
OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass =
Win32_LogicalDiskToPartition"} | %{$_.Deviceid}
setx OSDUSBDrive $letters /M
Write-Output $diskdrive, $letters}
Start-Sleep -s 5
if (-not ("Win32.NativeMethods" -as [Type]))
{
# import sendmessagetimeout from win32
Add-Type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
"@
}
$HWND_BROADCAST = [IntPtr] 0xffff;
$WM_SETTINGCHANGE = 0x1a;
$result = [UIntPtr]::Zero
# notify all windows of environment block change
[Win32.Nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [UIntPtr]::Zero, "Environment", 2, 5000, [ref] $result);
Start-Sleep -s 5
錯誤:語法無效。預設選項不允許超過“2”次。 C:\temp\AddOSDUSBDrive_NEW.ps1:10 : 1 + setx OSDUSBDrive $字母 /M + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : 未指定: (Erreurÿ: 文法...加上de 2 fois.:String) [], RemoteException + FullQualifiedErrorId : NativeCommandError Entrez "SETX /?"附註語法。
任何想法?
答案1
使用setx OSDUSBDrive "$letters" /M
應用SETX.exe
句法圖案
SETX [/s Computer [Credentials]] Variable Value [/m] ↑↑↑↑↑
如果$letters
如果包含更多字母例如F:
, G:
,H:
setx OSDUSBDrive $letters /M
# ↑↑↑↑↑↑↑↑ this evaluates to
setx OSDUSBDrive F: G: H: /M
# ↑↑ ↑↑ ↑↑ three space-separated values (WRONG)
調整後(見語法:轉義字元、分隔符號和引號):
setx OSDUSBDrive "$letters" /M
# ↑↑↑↑↑↑↑↑↑↑ this evaluates to
setx OSDUSBDrive "F: G: H:" /M
# ↑↑↑↑↑↑↑↑ one string value (quotes = escape characters)
而且,我將第一個調整IF
如下:
if ( $diskdrive = ( Get-WmiObject win32_diskdrive |
Where-Object { $_.interfacetype -in ('USB','SCSI') } ) ) {
解釋:-or
運算子表示邏輯或:TRUE
當任一即,如果第一個操作數的計算結果為TRUE
,則其他操作數永遠不會被計算。
例如,運行
Remove-Variable a, b -ErrorAction SilentlyContinue
if ( ($a = 1) -or ($b = 3) ) { Write-host "a=$a b=$b" }
無法檢索變數“$b”,因為尚未設定它。
if ( ($a = $null) -or ($b = 3) ) { Write-host "a=$a b=$b" }
a = b = 3
答案2
我實際上按照你的建議添加了這個:
if ( $diskdrive = ( Get-WmiObject win32_diskdrive |Where-Object { $_.interfacetype -in ('USB','SCSI') } ) ) {
當我手動執行該腳本時,該腳本工作正常,但是當從 SCCM 呼叫它時,我收到以下錯誤
您必須在“-”運算符的右側提供值表達式。 TaskSequencePSHost 3/6/2018 4:36:37 PM 0 (0x0000) 在 D:\SMS\PKG\SE1001B5\AddOSDUSBDrive_NEW.ps1:2 char:42 +Where-Object { $_.interfacetype - <<< in ( 'USB','SCSI') } ) ){ TaskSequencePSHost 3/6/2018 4:36:37 PM 0 (0x0000) ParserError: (:) [], ParseException TaskSequencePSHost 3/6/2018 4:36:33 PM 06: (0x0000) TSHOST:腳本已完成,回傳代碼為0 TaskSequencePSHost 3/6/2018 4:36:37 PM 0 (0x0000)