2016-04-01 12 views
2

私はコンピュータのログオンの背景を変更するスクリプトを作成しています。私は必要なすべてを行う必要がありますが、スクリプトをより効率的にしようとしています。新しいものを選択した後、OrderNamesという名前の関数を呼び出して、すべての名前をランダムに変更し、それらは背景1、2、3、などです。結構な動作しますが、私は単に$BGOld$BGNewの名前を切り替えできるようにしたいと思い2つのファイルの名前を切り替える

Function OrderNames #Renames everything to a format better than random numbers 
{ 
    $FileNames = GCI $BGPath -exclude $BGOld 
    $FileNames | ForEach-Object -process { Rename-Item $_ -NewName "$Get-Random).jpg" } 
    $OrderNames = GCI $BGPath -exclude $BGOld 
    $OrderNames | ForEach-Object -begin { $count = 1 } -process 
    { Rename-Item $_ -NewName "background$count.jpg"; $count++ } 
} 

$Path = "C:\Windows\System32\oobe\info\backgrounds" 
$BGOld = GCI $BGPath "backgrounddefault.jpg"  #Store current background name 
$BGFiles = GCI $BGPath -exclude $BGOld   #Get all other images 
$BGNew = $BGFiles[(get-random -max ($BGFiles.count)] #Select new image 
Rename-Item $BGOld.FullName "$(Get-Random)-$($_.Name).jpg" 
Rename-Item $BGNew.FullName "backgrounddefault.jpg" 
OrderNames 

:ここでは私が働いているものの抜粋です。大学ではCで一時変数を作成し、BGNewをそこに保存し、BGNewをBGOldに等しくしてからBGOldを等価にすることができました。しかし、BGOldの値を使って一時変数を作成すると、動作しません。実際には、変数はリネーム機能では変更されておらず、他の結果と同じに設定されています。

項目が存在しないため名前を変更できません。

ファイン、私はSelect basenameで変数にファイルの名前だけを設定しようとしたが、私はタイプsystem.io.fileinfoのオブジェクトへのインデックスすることはできません

に関するエラーが発生します。

また、私はRename-Itemといくつか他の人と私は今覚えていないことを試みたが、$BGOld.FullName = $BGNew.FullNameを試してみました。

アイテム名をコピーしようとしましたが、これも機能しませんでした。私はそれが私が見落としてきた単純なものではないと思っています。

TL; DR
は、私は、ファイルの名前を変更するとき、私は一時変数の名前をコピーすることができるように、「古い」に戻っオーバー、一時変数にファイルの名前をコピーすることは可能ですすべての名前を変更しないようにするには?あるいは、ファイル名を切り替えることはできますか?

+0

最初のファイルの名前を一時的な名前に変更し、2番目のファイルの名前を最初のファイルの名前に変更してから、一時ファイルの名前を2番目のファイルの名前に変更します。 –

+0

ディスク上のファイルの名前をランダムに変更してから、新しいファイルの名前を古いものに変更する*は、あなたが記述したC変数スワップのメモリと同じファイルシステムです –

+0

@Bill_Stewart私はそれをやってみましたが、私はそれをさせません - 私はファイル名が存在しない、またはそれ以上のエラーについては、パスを取得しようとすると、パスはnullです。 – user6111573

答えて

1

はい、PowerShellでも同様のことができます。

  1. はの名前に古い名前を変更し、古い
  2. の名前に新しい名前を変更し、一時的なものに、古い名前を変更します:あなたがCのために説明するように、このための「アルゴリズム」は基本的に同じです新しい

私たちが追跡する必要がある唯一の情報は、古い名前と新しい名前+一時ファイル名です。

# Grab the current background and pick the new one 
$BGPath = "C:\Windows\System32\oobe\info\backgrounds" 
$CurrentBG = Get-Item (Join-Path $BGPath -ChildPath 'backgrounddefault.jpg') 
$NewBG  = Get-ChildItem $BGPath -Filter *.jpg -Exclude $CurrentBG.Name |Get-Random 
# Store the current name of the new background in a variable 
$NewBGName = $NewBG.Name 

# Now comes the swap operation 
# 1. Rename old file to something completely random, but keep a reference to it with -PassThru 
$OldBG = $CurrentBG |Rename-Item -NewName $([System.IO.Path]::GetRandomFileName()) -PassThru 

# 2. Rename new file to proper name 
$NewBG |Rename-Item -NewName 'backgrounddefault.jpg' 

# 3. And finally rename the old background back to the name previously used by the new background 
$OldBG |Rename-Item -NewName $NewBGName 
+0

ありがとうございました!私は自分の一時的な名前を適切に初期化していませんでしたが、[System.IO.Path]をあなたのように使うことについては全く考えていませんでした。私はどちらかを持っている必要があるように名前を変更する項目にパイプしていませんでした。私の無知を許して、まだパワーシェルのすべてのインとアウトを学んだことはありません。 – user6111573

+0

@ user6111573あまりにも心配しないで、私たちは皆生きて学びます。コレクションを 'Get-Random'に配管すると、コレクションからランダムなアイテムも返されます。ランダムなインデックスを計算するよりも簡潔です。 –

関連する問題