创建Powershell文件夹

时间:2017-02-08 13:21:53

标签: powershell

我有一个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

3 个答案:

答案 0 :(得分:1)

让我们来看看你的逻辑:

  1. 您正在使用if语句,如果某些内容返回true,则会生效
  2. 您正在使用test-path cmdlet,如果存在某些内容,则返回true
  3. 看到问题?你需要做反之亦然:

    if (!(test-path ...)) { ... } # ! - is the operator to invert true to false
    

    或者你可以切换if和else内容,所以当if执行它时会返回“已创建的文件夹”,否则会创建文件夹

答案 1 :(得分:1)

作为编码风格的问题,我会避免使用具有不同语义的相同变量名,如($ Studfolders in $ Studfolders)。这样的代码很难在未来几个月阅读。我通常对集合中的每个对象使用单数形式,如($ Studfolder in $ Studfolders)。但如果你的风格适合你,那么。

以前的答案已经指出你的逻辑是倒退的。你需要扭转它。

接下来,它不会让我觉得你正在访问循环中每个项目的组件。当您执行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“

的原因

如果情况并非如此,那么您将不得不做一些不同的事情。

答案 2 :(得分:0)

使用脚本尝试了所有内容后,我无法捕获错误。我决定问我的经理,他提出了以下可以很好地解决问题的解决方案。

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寻求帮助,试着找到答案。