如果目录不存在,请创建目录

时间:2013-06-03 21:30:26

标签: powershell windows-server-2008 powershell-ise

我正在编写一个PowerShell脚本来创建几个目录(如果它们不存在)。

文件系统看起来与此类似

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • 每个项目文件夹都有多个修订版。
  • 每个修订文件夹都需要一个Reports文件夹。
  • 某些“revisions”文件夹已包含Reports文件夹;但是,大多数人没有。

我需要编写一个每天运行的脚本来为每个目录创建这些文件夹。

我能够编写脚本来创建文件夹,但创建多个文件夹是有问题的。

12 个答案:

答案 0 :(得分:435)

您是否尝试过-Force参数?

New-Item -ItemType Directory -Force -Path C:\Path\That\May\Or\May\Not\Exist

您可以先使用Test-Path -PathType Container进行检查。

有关详细信息,请参阅New-Item MSDN帮助文章。

答案 1 :(得分:116)

$path = "C:\temp\NewFolder"
If(!(test-path $path))
{
      New-Item -ItemType Directory -Force -Path $path
}

Test-Path检查路径是否存在。如果没有,它将创建一个新目录。

答案 2 :(得分:13)

我遇到了完全相同的问题。你可以使用这样的东西:

$local = Get-Location;
$final_local = "C:\Processing";

if(!$local.Equals("C:\"))
{
    cd "C:\";
    if((Test-Path $final_local) -eq 0)
    {
        mkdir $final_local;
        cd $final_local;
        liga;
    }

    ## If path already exists
    ## DB Connect
    elseif ((Test-Path $final_local) -eq 1)
    {
        cd $final_local;
        echo $final_local;
        liga;  (function created by you TODO something)
    }
}

答案 3 :(得分:9)

当您指定-Force标志时,如果该文件夹已存在,PowerShell将不会抱怨。

一衬垫:

Get-ChildItem D:\TopDirec\SubDirec\Project* | `
  %{ Get-ChildItem $_.FullName -Filter Revision* } | `
  %{ New-Item -ItemType Directory -Force -Path (Join-Path $_.FullName "Reports") }

BTW,如需安排任务,请查看以下链接:Scheduling Background Jobs

答案 4 :(得分:8)

我使用PowerShell

创建目录有三种方法
Method 1: PS C:\> New-Item -ItemType Directory -path "c:\livingston"

enter image description here

Method 2: PS C:\> [system.io.directory]::CreateDirectory("c:\livingston")

enter image description here

Method 3: PS C:\> md "c:\livingston"

enter image description here

答案 5 :(得分:4)

以下代码段可帮助您创建完整路径。

 Function GenerateFolder($path){
    $global:foldPath=$null
    foreach($foldername in $path.split("\")){
          $global:foldPath+=($foldername+"\")
          if(!(Test-Path $global:foldPath)){
             New-Item -ItemType Directory -Path $global:foldPath
            # Write-Host "$global:foldPath Folder Created Successfully"
            }
    }   
}

上面的函数拆分传递给函数的路径,并检查每个文件夹是否存在。如果它不存在,它将创建相应的文件夹,直到创建目标/最终文件夹。

要调用该函数,请使用以下语句:

GenerateFolder "H:\Desktop\Nithesh\SrcFolder"

答案 6 :(得分:3)

从您的情况来看,您需要每天创建一个“Revision#”文件夹,其中包含“Reports”文件夹。如果是这种情况,您只需知道下一个修订版号是什么。编写一个获取下一个修订号Get-NextRevisionNumber的函数。或者你可以这样做:

foreach($Project in (Get-ChildItem "D:\TopDirec" -Directory)){
    #Select all the Revision folders from the project folder.
    $Revisions = Get-ChildItem "$($Project.Fullname)\Revision*" -Directory

    #The next revision number is just going to be one more than the highest number.
    #You need to cast the string in the first pipeline to an int so Sort-Object works.
    #If you sort it descending the first number will be the biggest so you select that one.
    #Once you have the highest revision number you just add one to it.
    $NextRevision = ($Revisions.Name | Foreach-Object {[int]$_.Replace('Revision','')} | Sort-Object -Descending | Select-Object -First 1)+1

    #Now in this we kill 2 birds with one stone. 
    #It will create the "Reports" folder but it also creates "Revision#" folder too.
    New-Item -Path "$($Project.Fullname)\Revision$NextRevision\Reports" -Type Directory

    #Move on to the next project folder.
    #This untested example loop requires PowerShell version 3.0.
}

PowerShell 3.0 installation

答案 7 :(得分:3)

[System.IO.Directory]::CreateDirectory('full path to directory')

这在内部检查目录是否存在,如果没有目录,则创建一个目录。只需一行和本机.NET方法即可正常工作。

答案 8 :(得分:2)

我希望能够轻松让用户为PowerShell创建默认配置文件以覆盖某些设置,最后使用以下单行(多个语句是,但可以粘贴到PowerShell中并立即执行,这是主要目标):

cls; [string]$filePath = $profile; [string]$fileContents = '<our standard settings>'; if(!(Test-Path $filePath)){md -Force ([System.IO.Path]::GetDirectoryName($filePath)) | Out-Null; $fileContents | sc $filePath; Write-Host 'File created!'; } else { Write-Warning 'File already exists!' };

为了便于阅读,我将在ps1文件中执行此操作:

cls; # Clear console to better notice the results
[string]$filePath = $profile; # declared as string, to allow the use of texts without plings and still not fail.
[string]$fileContents = '<our standard settings>'; # Statements can now be written on individual lines, instead of semicolon separated.
if(!(Test-Path $filePath)) {
  New-Item -Force ([System.IO.Path]::GetDirectoryName($filePath)) | Out-Null; # Ignore output of creating directory
  $fileContents | Set-Content $filePath; # Creates a new file with the input
  Write-Host 'File created!';
} else {
  Write-Warning "File already exists! To remove the file, run the command: Remove-Item $filePath";
};

答案 9 :(得分:1)

这是一个适合我的简单方法。它检查路径是否存在,如果不存在,它不仅会创建根路径,还会创建所有子目录:

$rptpath = "C:\temp\reports\exchange"

if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}

答案 10 :(得分:1)

$path = "C:\temp\"

If(!(test-path $path))

{md C:\Temp\}
  • 第一行创建一个名为$path的变量,并为其指定字符串值“C:\ temp \”

  • 第二行是If语句,它依赖于Test-Path cmdlet来检查变量$path是否不存在。使用!符号

  • 限定不存在
  • 第三行:如果找不到上面字符串中存储的路径,则会运行大括号之间的代码

md是输入的简短版本:New-Item -ItemType Directory -Path $path

注意:我没有使用下面的-Force参数进行测试,看看路径是否存在时是否存在不良行为。

New-Item -ItemType Directory -Path $path

答案 11 :(得分:0)

 public partial class Histogram : UserControl
    {
        public Histogram()
        {
            InitializeComponent();
            Histogram_Chart_Data = new ChartValues<ObservableValue> { new ObservableValue(0), };
            SeriesCollectionLog = new SeriesCollection
            {
                new LineSeries
                {
                Name = "HistogramLog",
                Values = Histogram_Chart_Data,
                PointGeometry = null,
                DataLabels = false,
                LabelPoint = point => Math.Round(Math.Pow(10, point.Y)) + " Pixel",
                StrokeThickness = 3,
                PointGeometrySize = 0,
                Fill = System.Windows.Media.Brushes.Transparent,
                }
            };
            DataContext = this;
        }

        public SeriesCollection SeriesCollectionLog { get; set; }
        public ChartValues<ObservableValue> Histogram_Chart_Data { get; set; }
    }

“Sal”只是我自己库的任意前缀。您可以将其删除或替换为您自己的。

另一个例子(放在这里是因为它会破坏 stackoverflow 语法高亮显示):

        <Grid>
        <lvc:CartesianChart Name="LogScale" Series="{Binding SeriesCollectionLog}" LegendLocation="None"  Height="200" >
            <lvc:CartesianChart.AxisY>
                <lvc:LogarithmicAxis Title="Pixels" MinValue = "0"></lvc:LogarithmicAxis>
            </lvc:CartesianChart.AxisY>
            <lvc:CartesianChart.AxisX >
                <lvc:Axis Title="Value" MinValue = "0" MaxValue="255" >
                    <lvc:Axis.Separator>
                        <lvc:Separator IsEnabled="False" Step="{Binding Step}"></lvc:Separator>
                    </lvc:Axis.Separator>
                </lvc:Axis>
            </lvc:CartesianChart.AxisX>
            <lvc:CartesianChart.DataTooltip>
                    <lvc:DefaultTooltip   SelectionMode="{x:Null}" IsWrapped ="false" />
            </lvc:CartesianChart.DataTooltip>
        </lvc:CartesianChart>
        </Grid>