创建目录(如果不存在)


341

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

文件系统看起来与此类似

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • 每个项目文件夹都有多个修订版本。
  • 每个修订文件夹都需要一个“报告”文件夹。
  • 一些“修订”文件夹已经包含一个“报告”文件夹。但是,大多数不是。

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

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


3
“创建多个文件夹是有问题的”-您遇到什么样的问题?您不确定如何写鳕鱼吗?您收到错误消息了吗?脚本运行后文件夹没有出现吗?不同的问题需要不同的解决方案。
LarsH

Answers:


533

尝试-Force参数:

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

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

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


101
对于懒惰者,有一个简写:md -Force c:\ foo \ bar \ baz
Matthew Fellows

74
对于那些在创建文件夹时不想要任何输出的用户,请在末尾添加“ | Out-Null”
armannvg

20
-Force实际上会做什么?文档说:“强制该cmdlet创建覆盖现有只读项目的项目”。它将删除现有文件夹吗?这个答案应该很清楚。
彼得·莫滕森

24
@PeterMortensen对于目录,强制使用它们不会清除现有内容,只会抑制显示已创建目录的错误消息。该命令还将创建任何必要的中间文件夹,并且这些文件夹的内容(如果已存在)也是安全的。
John Neuhaus

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

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


真好!如果目录已经存在,则此操作将使输出静音(因为使用test-path)。
好战的黑猩猩

17

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

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"

1
这不是最简单的一个,但对于理解来说却是简单的一个。
王继军

不错的解决方案!谢谢;)
Alberto S.19年

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)
    }
}

11

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

单线:

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

顺便说一句,要安排任务,请查看以下链接:安排后台作业


10

采用:

$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

1
这也适用于目录层次结构将md "C:\first\second\third它们全部创建。
MortenB

9

我知道使用PowerShell创建目录的三种方法:

Method 1: PS C:\> New-Item -ItemType Directory -path "C:\livingston"

在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明


注意,md只是mkdir(make目录)的Powershell默认别名,mkdir是类似于Linux / Unix mkdir的Windows命令。参考:`Get-Alias
md`– BentChainRing

4

从您的情况看来,您似乎需要每天创建一个“ 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 two 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安装


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";
};

1

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

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

if (!(test-path -path $rptpath)) {new-item -path $rptpath -itemtype directory}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.