오류: 잘못된 구문입니다. 기본 옵션은 '2'회 이상 허용되지 않습니다.

오류: 잘못된 구문입니다. 기본 옵션은 '2'회 이상 허용되지 않습니다.

컴퓨터에 연결된 USB 또는 SCSI 인터페이스 유형을 식별하기 위해 아래 powershell 스크립트를 실행하려고 합니다. 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 $letters /M + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (Erreurÿ: Syntax...plus de 2 fois.:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError Entrez "SETX /?" Afficher la Syntaxe를 따르세요.

어떤 아이디어?

답변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연산자는 논리적 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) At D:\SMS\PKG\SE1001B5\AddOSDUSBDrive_NEW.ps1:2 char:42 + Where-Object { $_.interfacetype - <<<< in ( 'USB','SCSI') } ) ){ TaskSequencePSHost 3/6/2018 오후 4:36:37 0 (0x0000) ParserError: (:) [], ParseException TaskSequencePSHost 3/6/2018 4:36:37 PM 0 (0x0000) TSHOST: 스크립트가 반환 코드 0으로 완료되었습니다. TaskSequencePSHost 3/6/2018 4:36:37 PM 0 (0x0000)

관련 정보