[英]Powershell folder creation
我有一個Powershell腳本,可以根據每個學生的學生編號在我們的NAS上創建文件夾。 文件夾的名稱來自我從服務器導入的.csv文件。 這就是我得到的:
Set-Location "C:\studentdata"
$StudFolders = import-csv \\servername\datafolder\studfolders.csv
ForEach ($StudFolders in $StudFolders) {
if(Test-Path -Path C:\Studentdata\$StudFolders) {
New-Item $StudFolders.Name -type directory
}else{
"Folders already created"
}
}
如果我只運行一次,則此腳本效果很好。 如果再次運行它,則在控制台窗口中會出現有關已存在文件夾的錯誤。 我想做的是利用腳本的IF部分捕獲錯誤,但是我不確定我是否正確使用了Powershell的IF。 如果我用更多的學生編號編輯.csv,這將有所幫助,它將顯示無誤。
有人可以指出我正確的方向嗎?
編輯:
這就是我在studfolders.csv中擁有的
Name
2003040052
2003060213
2003060310
2003060467
讓我們看看您的邏輯:
if
語句,如果返回true,則該語句有效 test-path
cmdlet,如果存在某些內容,則返回true 看到問題了嗎? 反之亦然:
if (!(test-path ...)) { ... } # ! - is the operator to invert true to false
或者你可以if和else內容切換,所以當if
執行返回“已創建的文件夾”,而其他人創建的文件夾
就編碼風格而言,我將避免使用相同的變量名和不同的語義,如($ Studfolders中的$ Studfolders)。 這樣的代碼很難在幾個月后閱讀。 我通常對集合中的每個對象使用單數形式,例如($ Studfolders中的$ Studfolder)。 但是,如果您的風格適合您,那么可以。
先前的答案已經指出您的邏輯是倒退的。 您需要扭轉它。
接下來,在我看來,您好像並沒有訪問循環中每個項目的組件。 當您執行Import-Csv時,會發生以下幾件事:csv文件中的第一條記錄被視為標頭,為后面的字段提供名稱。 如果您的csv文件中確實有一個標頭,則從每個項目中檢索第一個字段時,即使它是唯一字段,也需要引用它。
import-csv的結果是一組自定義對象。 每個自定義對象看起來都像一個包含鍵,值對的哈希表。 這樣的事情可能會起作用
Set-Location "C:\studentdata"
$StudFolders = import-csv \\servername\datafolder\studfolders.csv
ForEach ($StudFolder in $StudFolders) {
if(Test-Path -Path C:\Studentdata\$StudFolder.Name) {
"Folders already created"
}else{
New-Item $StudFolder.Name -type directory
}
}
我假設Csv文件中的第一條記錄如下所示:
"Name"
這就是為什么我將該字段引用為$ Studfolder.Name”的原因
如果不是這種情況,您將不得不做一些不同的事情。
嘗試使用腳本進行所有操作后,我無法捕獲該錯誤。 我決定問我的經理,他想出了以下解決方案,該解決方案效果很好,可以發現錯誤。
import-csv '\\servername\datafolder\studfolders.csv'|ForEach-Object -process {
$path =$_.Name
$path='C:\Studentdata\'+$path
if (Test-Path -Path $path){
"Folder already created"
} else {
New-Item $path -type directory
}
}
感謝@Walter Mitty和@ 4c74356b41的幫助,試圖找到答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.