0

次のコードを使用して、Windowsフォームの「参照」機能でフォルダーを選択し、そのパスをgciコマンドレットに渡します。

cls

Function Get-Directory($initialDirectory)
{   
 [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
 Out-Null

 $OpenfolderDialog = New-Object System.Windows.Forms.FolderBrowserDialog
 $OpenfolderDialog.RootFolder = $initialDirectory
 $OpenfolderDialog.ShowDialog()| Out-Null
 $StartDir = $OpenfolderDialog.SelectedPath 
 Return $StartDir | Out-String
 } 

 $myDir = Get-Directory -initialDirectory "Desktop"

 $Child = gci -path $mydir -r -Filter *.jpg 

 Foreach ($item in $Child) {Move-Item -path $item.pspath -Destination $myDir -Force}

しかし、私はこれらのエラーを受け取ります:

*** C:\ Test \ Combine Pics2.ps1:17 char:13 + $ Child = gci <<<< -path $ mydir -r -Filter * .jpg + CategoryInfo:ObjectNotFound:(C:\ Test:String )[Get-ChildItem]、ItemNotFoundException + FullyQualifiedErrorId:PathNotFound、Microsoft.PowerShell.Commands.GetChildItemCommand

Move-Item:引数がnullであるため、パラメーター'Path'に引数をバインドできません。C:\ Test \ Combine Pics2.ps1:19 char:43 + Foreach($ item in $ Child){Move-Item -path <<<< $ item.pspath -Destination $ myDir -Force} + CategoryInfo:InvalidData: (:) [Move-Item]、ParameterBindingValidationException + FullyQualifiedErrorId:ParameterArgumentValidationErrorNullNotAllowed、Microsoft.PowerShell.Commands.MoveItemCommand ***

$ myDir変数はString型ですが、なぜ-pathパラメーターに渡されないのですか。

4

3 に答える 3

2

ユーザーがダイアログをキャンセルした場合はどうなりますか?これを試してみてください:

Function Get-Directory($initialDirectory)
{   
     [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null

     $OpenfolderDialog = New-Object System.Windows.Forms.FolderBrowserDialog
     $OpenfolderDialog.RootFolder = $initialDirectory
     $result = $OpenfolderDialog.ShowDialog()

     if($result -eq 'ok')
     {
         $OpenfolderDialog.SelectedPath
     }
     else
     {
        "canceled"
     }
 } 


$mydir = Get-Directory -initialDirectory Desktop

if($mydir -ne 'canceled')
{
    gci -path $mydir
}
于 2013-01-23T20:15:27.420 に答える
1

これを試して:

Function Get-Directory($initialDirectory)
{   
    [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null

    $OpenfolderDialog = New-Object System.Windows.Forms.FolderBrowserDialog
    $OpenfolderDialog.RootFolder = $initialDirectory
    if ($OpenfolderDialog.ShowDialog() -eq "OK") {
        #Continue only if a folder was selected
        $OpenfolderDialog.SelectedPath
    }
} 

$myDir = Get-Directory -initialDirectory "Desktop"

#Continue only if a folder was selected
if($myDir) {
    $Child = Get-ChildItem -path $mydir -Recurse -Filter *.jpg
    Foreach ($item in $Child) {
        Move-Item -path $item.pspath -Destination $myDir -Force
    }
}

いくつかのif-testでクリーンアップしたので、ユーザーがダイアログをキャンセルしたときにエラーが返されません。単一の文字列を単独Out-Stringで返す必要はありませんでした。SelectedPath

于 2013-01-23T20:09:39.733 に答える
0

値の最後に改行とキャリッジリターンが表示さ$mydirれるので、次のようなものでトリミングしてみて、それが問題かどうかを確認してください。

$Child = gci -path $mydir.Trim("`r`n") -r -Filter *.jpg

更新:Out-Stringさらに良いことに、関数を失うだけです:

Return $StartDir
于 2013-01-23T20:02:20.590 に答える