अगर यह मौजूद नहीं है तो डायरेक्टरी बनाएं


341

मैं कई निर्देशिका बनाने के लिए एक PowerShell स्क्रिप्ट लिख रहा हूं यदि वे मौजूद नहीं हैं।

फाइलसिस्टम इसके समान दिखता है

D:\
D:\TopDirec\SubDirec\Project1\Revision1\Reports\
D:\TopDirec\SubDirec\Project2\Revision1\
D:\TopDirec\SubDirec\Project3\Revision1\
  • प्रत्येक प्रोजेक्ट फ़ोल्डर में कई संशोधन होते हैं।
  • प्रत्येक संशोधन फ़ोल्डर को एक रिपोर्ट फ़ोल्डर की आवश्यकता होती है।
  • कुछ "संशोधन" फ़ोल्डर में पहले से ही एक रिपोर्ट फ़ोल्डर शामिल हैं; हालाँकि, अधिकांश नहीं।

मुझे एक स्क्रिप्ट लिखने की ज़रूरत है जो प्रत्येक निर्देशिका के लिए इन फ़ोल्डरों को बनाने के लिए दैनिक चलती है।

मैं एक फ़ोल्डर बनाने के लिए स्क्रिप्ट लिखने में सक्षम हूं, लेकिन कई फ़ोल्डर्स बनाना समस्याग्रस्त है।


3
"कई फ़ोल्डर्स बनाना समस्याग्रस्त है" - आपको किस तरह की समस्या हो रही है? क्या आप सुनिश्चित नहीं हैं कि कॉड कैसे लिखें? क्या आपको कोई त्रुटि संदेश मिल रहा है? क्या स्क्रिप्ट चलने के बाद फ़ोल्डर्स दिखाई नहीं देते हैं? विभिन्न समस्याओं के लिए अलग-अलग समाधान की आवश्यकता होती है।
लार्स

जवाबों:


535

-Forceपैरामीटर आज़माएं :

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

आप Test-Path -PathType Containerपहले जांच करने के लिए उपयोग कर सकते हैं ।

देखें नई मद अधिक जानकारी के लिए MSDN सहायता लेख।


101
आलसी के लिए, एक आशुलिपि है: md -Force c: \ foo \ bar \ baz
मैथ्यू फैलो

74
उन लोगों के लिए जो फ़ोल्डर बनाते समय कोई आउटपुट नहीं चाहते हैं, अंत में "| Out-Null" जोड़ें
armannvg

20
वास्तव में क्या करेंगे? दस्तावेज़ कहता है "इस cmdlet को एक आइटम बनाने के लिए मजबूर करता है जो मौजूदा रीड-ओनली आइटम पर लिखता है" । क्या यह एक मौजूदा फ़ोल्डर को हटा देगा? इस उत्तर में स्पष्ट होना चाहिए।
पीटर मोर्टेंसन

25
@PeterMortensen निर्देशिकाओं के मामले में, उन्हें मजबूर करने से मौजूदा सामग्री स्पष्ट नहीं होती है, यह केवल यह कहते हुए त्रुटि संदेश को दबा देता है कि यह पहले से ही बनाया गया है। यह कमांड किसी भी हस्तक्षेप करने वाले फ़ोल्डर को भी आवश्यक बना देगा, और यदि वे पहले से ही मौजूद हैं, तो उन फ़ोल्डरों की सामग्री भी सुरक्षित है।
जॉन नेउहॉउस

161
$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
यह एक सबसे आसान नहीं है, लेकिन समझने के लिए एक आसान है।
वांग जीजुन

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बयान है जो परीक्षण-पथ cmdlet पर निर्भर करता है कि चर मौजूद नहीं है $pathया नहीं । मौजूद नहीं !प्रतीक का उपयोग कर योग्य है ।

  • तीसरी पंक्ति: यदि उपरोक्त स्ट्रिंग में संग्रहीत पथ नहीं मिला है, तो घुंघराले कोष्ठक के बीच का कोड चलाया जाएगा।

md टाइपिंग का लघु संस्करण है: New-Item -ItemType Directory -Path $path

नोट: मैंने -Forceनीचे के साथ पैरामीटर का उपयोग करके यह देखने के लिए परीक्षण नहीं किया है कि क्या अवांछनीय व्यवहार है यदि पथ पहले से मौजूद है।

New-Item -ItemType Directory -Path $path

1
यह निर्देशिकाओं के एक पदानुक्रम के लिए भी काम करता है जो md "C:\first\second\thirdउन सभी को बनाते हैं।
मोर्टेनबी

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 के समान एक विंडोज़ कमांड के लिए` mkdir` (निर्देशिका बनाएँ) के लिए एक पॉवर्सशेल डिफ़ॉल्ट उपनाम है। रेफरी: `गेट-एलियास एमडी '
बेंटचिनरिंग

4

आपकी स्थिति से ऐसा लगता है कि आपको दिन में एक बार "रिवीजन #" फोल्डर बनाने की आवश्यकता है जिसमें "रिपोर्ट्स" फोल्डर है। यदि ऐसा है, तो आपको केवल यह जानना होगा कि अगला संशोधन संख्या क्या है। एक फ़ंक्शन लिखें जो अगला संशोधन संख्या प्राप्त करता है, 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}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.