1. ホーム
  2. powershell

[解決済み] Powershellで予期しないトークンエラーが発生する

2022-03-14 18:21:48

質問

Windowsサーバーのローカルセキュリティポリシーを変更するスクリプトを作成しています。PowerShellプロンプトでこれらのコマンドを単独で実行すると、問題なく動作します。しかし、スクリプトを実行すると、次のようなメッセージが表示されます。 "Unexpected token 'PasswordComplexity' in expression or statement." というエラーが発生します。

この問題は、スクリプトが secedit コマンドを使用するため get-content の行には、編集するファイルがありません。

なぜ secedit は実行されないのですか?という質問に対して secedit コマンドの外側で if ステートメントを使用しても、同じ結果が得られます。

if ($win_ver -match "Server"){
    #export current secuirty policy
    secedit /export /cfg c:\new.cfg
    start-sleep -s 10
    #Disable Password Complexity
    ((get-content c:\new.cfg) -replace (‘PasswordComplexity = 1′, ‘PasswordComplexity = 0′)) | Out-File c:\new.cfg
    #Disable password expiration
    ((get-content c:\new.cfg) -replace (‘MaximumPasswordAge = 42′, ‘MaximumPasswordAge = -1′)) | Out-File c:\new.cfg
    #disable minmum password length
    ((get-content c:\new.cfg) -replace (‘MinimumPasswordLength = 6′, ‘MinimumPasswordLength = 1′)) | Out-File c:\new.cfg
    #import new security settings
    secedit /configure /db $env:windir\security\new.sdb /cfg c:\new.cfg /areas SECURITYPOLICY
}

解決方法は?

PowerShell の文字列リテラルは、シングルクォートで囲む必要があります。 '...' :

'string'

またはダブルクォート "..." :

"string"

このように の文字が無効であるため、置き換える必要があります。

((get-content c:\new.cfg) -replace ('PasswordComplexity = 1', 'PasswordComplexity = 0')) | Out-File c:\new.cfg


また、シングルクォートで囲まれた文字列リテラルは、変数を展開しないことに注意してください。 つまり、これです。

$var = 123
Write-Host "My number: $var"

が出力されます。

My number: 123

一方、これは

$var = 123
Write-Host 'My number: $var'

が出力されます。

My number: $var