2014-02-12 51 views
1

我已經找到了答案,但不是相當於我在找什麼。我不是程序員,所以調整非常複雜的腳本證明是困難的。Powershell:找一個文件夾名稱使用一個變量,每次都會有不同的值和長度

定期給我們提供一個.zip文件。文件名(在.zip擴展名之前)在大多數情況下會有所不同。它可以是字母或數字,並且長度各不相同。

我已經有一個PowerShell腳本,它使用Windows的本地解壓縮技術將文件內容解壓縮到一個以該文件命名的文件夾中(因爲內容最初位於具有該名稱的文件夾中)。然後將文件夾分發到需要的文件夾,然後將該文件夾移至「已部署」文件夾,然後通過刪除.zip進行清理。這一切都很好。

問題是,有時目標已經包含一個同名的文件夾,所以我們希望先備份。我需要PowerShell來查看是否存在具有該名稱的文件夾,然後將其複製到「回滾」文件夾中。

我目前有一個腳本可以完成所有這些工作,但它使用了一個假設文件名總是包含9個字符的數組(我發現)。我希望我的腳本只查看已經從解壓縮過程創建的文件夾名稱,而不是文件名。或者,對於現有的陣列來捨棄最後四個字符(.zip),而不是總是使用前九個字符。合理?

這是我現在所擁有的:

# Following code sets variables 

$filelocation = dir d:\admin\Type\files\*.zip 
foreach ($file in $filelocation){ 
$filename = $file.name.ToString() 
$shell_app=new-object -com shell.application 
$zip_file = $shell_app.namespace("d:\admin\Type\files\$filename") 
$destination = $shell_app.namespace("d:\admin\Type\files\") 

#Following line unzips the file 

$destination.Copyhere($zip_file.items()) 
} 

# Following chunk of code (that I found) converts the .zip filename to a string variable we can use in our Test-Path to see whether the folder already exists. 
# NOTE: Right now it uses only the first 9 characters, but I would like it to only use the basename of the above zip file 
# Or we could have it look at the name of the folder that results from the unzip (which always will match the basename of the .zip file) 

$Directory = "d:\admin\Type\files"; 
$AllFiles = Get-ChildItem $Directory | where {$_.extension -eq ".zip"}; 
$FileNames = New-Object System.Collections.ArrayList; 
foreach($File in $AllFiles) 
{ 
    $FileNames.Add($File.Name.SubString(0,9)); 
} 

# The above code loses me a bit, because it was written for someone whose filename will always be nine characters, and can handle multiple files. 
# Ours rarely will be more than one file, and will vary in length. 

# Following code says "if the folder exists in the website structure, back it up to the group.backups folder" 

if(Test-Path -path "D:\acronym\CurrentVersion\website.acronym\Type\Brands\$Name") 
{ 
Copy-Item D:\acronym\CurrentVersion\website.acronym\Type\Brands\$Name D:\group.backups\Type\Brands\ -force -recurse 
} 

# Following line removes the original .zip file from the files folder 

Remove-Item d:\admin\Type\files\*.zip -force 

# Following chunk of code copies the folder and its contents to the web server folder structure 

Copy-Item d:\admin\Type\files\$Name D:\acronym\CurrentVersion\website.acronym\Type\Brands\ -force 

# Following lines copy the folder and its contents to the completed folder 
# and then removes the folder and its contents from the files folder (for some reason Move-Item was only moving the files) 
# The files folder alway should be completely empty after this script finishes 

Copy-Item d:\admin\Type\files\* D:\admin\Type\completed\ -force -recurse 

Remove-Item d:\admin\Type\files\* -force -recurse 

回答

1

我不能給你一個明確的答案(沒有提供足夠的細節),但PowerShell有一些非常好的內置的幫助。 如果您運行這些命令並閱讀提供的幫助,至少應該有足夠的信息來幫助您入門。

Get-Help Test-Path -Full 
Get-Help Move-Item -Full 
+0

我第一次問一個問題,所以我不知道什麼細節丟失。我是否需要發佈我正在使用的實際腳本?由於企業安全問題,我不得不對其進行編輯,但我可以這麼做。測試路徑和移動項目命令,我已經在使用。我需要的是在.zip擴展名或文件夾名(每次長度不同)之前獲取文件名字符的方法,並查看它是否已存在於目標文件夾中。我已經完成了其餘的工作。謝謝。 – mawhog

+0

您可以發佈您的樣本,以及您正在處理的文件夾結構的示例。您可以通過.basename屬性獲取文件名(不帶擴展名)。 – mjolinor

+0

試圖將我的代碼添加到我原來的帖子。 – mawhog

相關問題