5

管理シェルから完全に実行されるPowerShellスクリプトを作成しました。Windows Server 2008 R2のスケジュールされたタスクで機能するようにセットアップしようとしていますが、文字列配列パラメーターのパラメーターを渡す方法がわかりません。

これが私のスクリプトの関連部分です:

[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)]
    [String]
        $BaseDirectory,
    [String]
        $BackupMethod = "Full",
    [Int]
        $RemoveOlderThanDays = 0,
    [String]
        $LogDirectory,
    [Int]
        $LogKeepDays = 7,
    [String[]]
        $AdditionalDirectories
)

if ($AdditionalDirectories -and $AdditionalDirectories.Count -gt 0) {
    Write-Host "  Additional Directories to be included:" -ForegroundColor Green
    $AdditionalDirectories | ForEach-Object {
        Write-Host "     $_" -foregroundcolor green
    }
}

問題を与えるパラメータは、最後のパラメータ$AdditionalDirectoriesです。

シェルから:

このように管理シェルからスクリプトを実行すると、完全に機能します。

.\FarmBackup.ps1 \\SomeServer\Backups Full 0 D:\Logs\Backups 0 "D:\Documents\PowerShell Scripts","D:\SomeFolder"

結果:

   Additional Directories to be included:
      D:/Documents/PowerShell Scripts
      D:/SomeFolder

スケジュールされたタスクから:

処置: プログラムを開始してください

プログラム/スクリプト: PowerShell.exe

引数: -File "D:\ Documents \ PowerShell Scripts \ FarmBackup.ps1" \\ SomeServer \ Backups Full 0 D:\ Logs \ Backups 0 "D:\ Documents \ PowerShell Scripts"、 "D:\ SomeFolder"

結果:(ログファイルから)

  Additional Directories to be included:
     D:\Documents\PowerShell Scripts,D:\SomeFolder

これらのパラメーターに対していくつかの異なる方法を試しましたが、文字列配列内の2つの別個の文字列として表示されるようには見えません。今のところハードコーディングしていますが、シェルから実行すると完全に有効であるため、これを機能させる方法があるはずです。

4

3 に答える 3

6

-Fileスイッチの代わりに-Commandスイッチを使用してから、呼び出し演算子「&」を使用してみてください。スケジュールされたタスクでこれを行う例へのリンクは次のとおりです。

http://blogs.technet.com/b/heyscriptingguy/archive/2011/01/12/schedule-powershell-scripts-that-require-input-values.aspx

何かのようなもの:

-Command "& 'D:\Documents\PowerShell Scripts\FarmBackup.ps1' '\\SomeServer\Backups' 'Full' 0 'D:\Logs\Backups' 0 'D:\Documents\PowerShell Scripts','D:\SomeFolder'"

次の内容のスクリプトを作成して、このソリューションをテストしました。

param([string[]] $x)
Write-Host $x.Count

次に、次の2つの方法で呼び出します。

powershell -File ".\TestScript.ps1" "what1,what2"

結果:1

powershell -Command "& .\TestScript.ps1 what1,what2"

結果:2

于 2012-10-02T14:52:43.057 に答える
2

別のオプションは、オプションが複雑になりすぎて、引用符やバッククォートなどをいじるのにうんざりしている場合、PowerShell.exeで十分に使用されていない-EncodedCommandパラメーターを使用することです。

C:\PS> $cmd = "c:\temp\foo.ps1 'D:\Documents\PowerShell Scripts','D:\SomeFolder'"
C:\PS> $cmd
c:\temp\foo.ps1 'D:\Documents\PowerShell Scripts','D:\SomeFolder'
C:\PS> $bytes = [Text.Encoding]::Unicode.GetBytes($cmd)
C:\PS> $encodedCmd = [Convert]::ToBase64String($bytes)
C:\PS> $encodedCmd
YwA6AFwAdABlAG0AcABcAGYAbwBvAC4AcABzADEAIAAnAEQAOgBcAEQAbwBjAHUAbQBlAG4AdABzAFwAUABvAHcAZQByAFMAaABlAGwAbAAgAFMAYwByAGkAcAB0AHMAJwAsACcARAA6AFwAUwBvAG0AZQBGAG8AbABkAGUAcgAnAA==
C:\PS> powershell.exe -encodedCommand YwA6AFwAdABlAG0AcABcAGYAbwBvAC4AcABzADEAIAAnAEQAOgBcAEQAbwBjAHUAbQBlAG4AdABzAFwAUABvAHcAZQByAFMAaABlAGwAbAAgAFMAYwByAGkAcAB0AHMAJwAsACcARAA6AFwAUwBvAG0AZQBGAG8AbABkAGUAcgAnAA==
param1[0] is D:\Documents\PowerShell Scripts
param1[1] is D:\SomeFolder

確かに、他の誰かが正確に読んだり理解したりできるものではありません。:-)スケジュールされたタスクの説明にコマンドを記録する必要があります。

于 2012-10-02T15:12:26.777 に答える
1

私はPowerShellforSharePointを使用しており、さまざまな間隔でそれらをトリガーするためにいくつかのスケジュールされたタスクを作成しました。

これは私がそれを行う方法であり、それは私のためにいつも働いていました。

構文:[urスクリプトへのパス'] -Param1Name' Value1'-Param2Name' Value2'-Param3Name' Value3 '

これが実際の例です:

D:\ Scripts \ Global.ps1 -DataLocation'D:\ Scripts' -DeploymentParameters'Deploymentparameters' -Deployments'Deployments' -GlobalParameters'GlobalParameters' -SiteUrl'https: //my.sp.company.com '

于 2014-03-11T15:38:00.550 に答える