PowerShell के साथ एक खाली फ़ाइल बनाने के लिए लिनक्स `टच` के बराबर? [डुप्लिकेट]


167

इस सवाल का पहले से ही यहाँ एक जवाब है:

PowerShell में इसके बराबर है touch?

उदाहरण के लिए लिनक्स में मैं एक नई खाली फ़ाइल बना सकता हूँ।

touch filename

विंडोज पर यह बहुत अजीब है - आमतौर पर मैं सिर्फ नोटपैड का एक नया उदाहरण खोलता हूं और एक खाली फाइल को बचाता हूं।

तो क्या ऐसा करने के लिए पॉवरशेल में प्रोग्रामेटिक तरीका है?

मैं स्पर्श के व्यवहार से बिल्कुल मेल नहीं खा रहा हूं, लेकिन केवल खाली फ़ाइलों को बनाने के लिए सबसे सरल संभव समकक्ष खोजना है।



धन्यवाद। मैंने उनकी ओर देखा, लेकिन अधिकांश उत्तर कमांड-प्रॉम्प्ट पर केंद्रित थे। मैं एक ऐसा PowerShell समाधान चाहता हूं जिसमें मुझे नए एप्लिकेशन इंस्टॉल करने की आवश्यकता न हो।
jsalonen

सवाल को टाल दिया - दोनों विशेषताएं कोड की केवल कुछ और पंक्तियां हैं, बस दोनों को लागू करें, न कि केवल आधा, esp। जब लापता आधा अन्य आदेश इतना खतरनाक है।
yzorg

@yzorg: दोनों विशेषताओं से आपका क्या तात्पर्य है? मैं केवल पीएस में खाली फाइल बनाने का तरीका पूछ रहा था जिस तरह से आप touchलिनक्स में कर सकते हैं ।
jsalonen

@jsalonen touchएक मौजूदा फ़ाइल पर * nix का उपयोग करें यह फ़ाइल को संशोधित किए बिना अंतिम लिखने के समय को अपडेट करेगा, @amiregelz से लिंक देखें। इस प्रश्न के लिए एक उच्च Google रैंकिंग है powershell touch, मैं कॉपी / पेस्ट-ers को सचेत करना चाहता था कि इसका आधा हिस्सा डेटा को नष्ट कर सकता है, जब * निक्स स्पर्श नहीं करता है। @LittleBoyLost उत्तर देखें जो उस फ़ाइल को संभालता है जो पहले से मौजूद है।
yzorg

जवाबों:


164

परिशिष्ट पुनर्निर्देशक का उपयोग करते हुए ">>" उस समस्या को हल करता है जहां एक मौजूदा फ़ाइल हटा दी जाती है:

echo $null >> filename

3
कमांड प्रॉम्प्ट से 'इको नल> फाइलन' के रूप में भी जाना जाता है, संभवतः एक बैच फ़ाइल। इसके PowerShell संस्करण को देखने के लिए कूल, धन्यवाद!
मार्क एलन

16
यदि फ़ाइल पहले से मौजूद है, तो टच इसके बजाय अलग है
jk।

9
गूंज अनावश्यक है, $null > filenameमहान काम करता है।
एलिरोबे

8
यह मेरे लिए यूनिकोड BOM 0xFEFF के 2 बाइट्स लिखता है।
19

4
महत्वपूर्ण नोट: कई यूनिक्स उपकरण BOM के साथ सौदा नहीं करते हैं। इसमें उदाहरण के लिए git भी शामिल है (विंडोज़ पर भी)। यदि आप BOMs को न पहचानने वाले टूल के साथ इस तरीके से बनाई गई फ़ाइलों का उपयोग करते हैं तो आपको समस्याएँ होने वाली हैं। उदाहरण के लिए, आप .gitignoreइस कमांड का उपयोग करके अपना निर्माण करने का प्रयास करते हैं और आश्चर्य करते हैं कि यह काम क्यों नहीं करेगा। BOM इसका कारण है।
मार्टिक्स

96

रिक्त फ़ाइल बनाने के लिए:

New-Item -ItemType file example.txt

किसी फ़ाइल का टाइमस्टैम्प अद्यतन करने के लिए:

(gci example.txt).LastWriteTime = Get-Date

4
मुझे लगता है कि यह सबसे अच्छा तरीका है!
जयेश भूत

क्या यह किसी फ़ोल्डर के टाइमस्टैम्प को अपडेट करने के लिए काम करता है?
riahc3

1
@ riahc3, इसका उपयोग करें (gi MyFolder).LastWriteTime = Get-Date:। आप फ़ाइलों के लिए भी इसका इस्तेमाल कर सकते हैं।
डॉगी जूल

9
और भी अधिक पीथी:ni example.txt
निक कॉक्स

2
यह विधि भयानक बीओएम बाइट्स को नहीं जोड़ती है और एन्कोडिंग खुशी से UTF-8 प्रतीत होती है।
दावोस

75

यहां एक संस्करण है जो एक नई फ़ाइल बनाता है यदि यह मौजूद नहीं है या मौजूद है तो टाइमस्टैम्प को अपडेट करता है।

Function Touch-File
{
    $file = $args[0]
    if($file -eq $null) {
        throw "No filename supplied"
    }

    if(Test-Path $file)
    {
        (Get-ChildItem $file).LastWriteTime = Get-Date
    }
    else
    {
        echo $null > $file
    }
}

4
यह यूनिक्स स्पर्श कार्यक्रम (एक अलग नाम के साथ यद्यपि) की नकल करने के लिए सही उत्तर है, लेकिन सवाल केवल एक नई फ़ाइल बनाने के लिए उन्मुख है।
जेमी स्कीबबरी

14
बहुत, बहुत छोटी वक्रोक्ति: जबकि टच-फाइल PS के Verb-Noun नामकरण सम्मेलन के अनुरूप है, Touch"स्वीकृत" क्रिया नहीं है (यह महत्वपूर्ण आवश्यकता नहीं है: msdn.microsoft.com/en-us/lift/ms714428 एस्पक्स )। Fileठीक है, btw मैं नाम की सिफारिश Set-Fileया Set-LastWriteTime, या, मेरी पसंदीदा Update-File। इसके अलावा, मैं इसके Add-Content $file $nullबजाय की सिफारिश करेंगे echo $null > $file। अंत में, Set-Alias touch Update-Fileयदि आप कमांड का उपयोग करते रहना चाहते हैं, तो एक उपनाम सेट करेंtouch
एलन मैकबी

अंतिम पंक्ति के रूप में इसे जोड़ने का सुझाव दें:New-Alias -Name Touch Touch-File
stimpy77

25

PowerShell में आप एक समान टच फंक्शन बना सकते हैं:

function touch {set-content -Path ($args[0]) -Value ($null)} 

उपयोग:

touch myfile.txt

स्रोत


यह बहुत अच्छा है, धन्यवाद! बस मुझे जो चाहिए था! कोई भी विचार कि मैं इस फ़ंक्शन को PowerShell में कैसे स्थापित कर सकता हूं ताकि शेल शुरू होने पर यह स्वचालित रूप से लोड हो जाए?
jsalonen

2
इसे अपनी $ प्रोफ़ाइल फ़ाइल में जोड़ें। (उस फ़ाइल को संपादित करने के लिए नोटपैड $ प्रोफ़ाइल चलाएं।)
मार्क एलन

25
यह मौजूद होने पर फ़ाइल की सामग्री को हटा देगा।
dangph

1
या सुरक्षित संस्करण जो मौजूदा फ़ाइल सामग्री को साफ़ नहीं करता है function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }
alastairtree

13

मैं पसंद करता हूं

fc > filename

इस कार्य के लिए। गैर-रिक्त फ़ाइलों के साथ काम करने के लिए आप उपयोग कर सकते हैं

fc >> filename

fcकेवल स्वरूप-कस्टम के लिए एक उपनाम है । मैंने इसे चुना क्योंकि यह एक छोटा कमांड है जो इस संदर्भ में कुछ भी नहीं करता है, एक नॉओप । यह भी अच्छा है क्योंकि अगर आप रीडायरेक्ट को भूल जाते हैं

fc filename

इसके बजाय आप एक त्रुटि दे, फिर से यह सिर्फ कुछ नहीं करता है। कुछ अन्य उपनाम जो काम करेंगे

ft -> Format-Table
fw -> Format-Wide

9

योग्य उत्तरों का एक समूह पहले से ही हैं, लेकिन मैं न्यू-आइटम के उपनाम को बहुत पसंद करता हूं जो सिर्फ: नी है

आप फ़ाइल प्रकार की घोषणा को भी वापस ले सकते हैं (जो मुझे लगता है कि जब कोई एक्सटेंशन जोड़ा जाता है तो यह निहित है), इसलिए मेरी वर्तमान निर्देशिका में 'x' के नाम के साथ एक जावास्क्रिप्ट फ़ाइल बनाने के लिए मैं बस लिख सकता हूं:

ni x.js

स्पर्श की तुलना में 3 वर्ण जल्दी!


यह आदर्श नहीं हैni : The file 'x.js' already exists
स्टीवन पेनी

8

मैंने विभिन्न स्रोतों को एक साथ रखा, और निम्नलिखित के साथ घाव किया, जो मेरी जरूरतों को पूरा करता था। मुझे एक DLL की लेखन तिथि निर्धारित करने की आवश्यकता थी जो एक अलग समय क्षेत्र में एक मशीन पर बनाया गया था:

$update = get-date
Set-ItemProperty -Path $dllPath -Name LastWriteTime -Value $update

बेशक, आप इसे कई फ़ाइलों के लिए भी सेट कर सकते हैं:

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update

1
+1 किसी फ़ाइल पर LastWriteTime (जो कि मुझे चाहिए) को बदलने के लिए Powershell-ish तरीके के लिए, हालांकि टच कमांड की नई फ़ाइल निर्माण सुविधा पर केंद्रित प्रश्न।
नाथन हार्टले

एक चर का उपयोग किए बिना?
riahc3

5

अपनी प्रोफ़ाइल फ़ाइल खोलें:

notepad $profile

निम्नलिखित पंक्ति जोड़ें:

function touch {New-Item "$args" -ItemType File}

इसे सहेजें और इसे सीधे उपयोग करने के लिए अपनी $ प्रोफ़ाइल पुनः लोड करें। (शक्तियां बंद करने और खोलने की आवश्यकता नहीं)

. $profile

वर्तमान निर्देशिका प्रकार में एक नई फ़ाइल जोड़ने के लिए:

touch testfile.txt

'Myfolder' निर्देशिका प्रकार के अंदर एक नई फ़ाइल जोड़ने के लिए:

touch myfolder\testfile.txt

यदि समान नाम वाली कोई फ़ाइल पहले से मौजूद है, तो उसे अधिभूत नहीं किया जाएगा। इसके बजाय आपको एक त्रुटि मिलेगी।

मुझे उम्मीद है यह मदद करेगा

बोनस टिप:

आप निम्न पंक्ति को जोड़कर 'mkdir' के बराबर कर सकते हैं:

function mkdir {New-Item "$args" -ItemType Directory} 

एक ही उपयोग:

mkdir testfolder
mkdir testfolder\testsubfolder

5
ac file.txt $null

फ़ाइल सामग्री नहीं हटाएंगे, लेकिन यह तिथि को भी अपडेट नहीं करेगा।


5

यह जवाब की एक गुच्छा की तरह लग रहा है यहाँ फ़ाइल एन्कोडिंग के लिए खाता नहीं है।

मैं सिर्फ इस समस्या में भाग गया, विभिन्न अन्य कारणों से, लेकिन

echo $null > $file

$null > $file

दोनों एक UTF-16-LE फ़ाइल का उत्पादन करते हैं, जबकि

New-Item $file -type file

UTF-8 फ़ाइल बनाता है।

जो भी कारण fc > $fileऔर fc >> $file, के लिए भी UTF-8 फ़ाइलों का उत्पादन लगता है।

Out-File $file -encoding utf8

आपको UTF-8-BOM फ़ाइल देता है, जबकि

Out-File $file -encoding ascii

आपको UTF-8 फ़ाइल देता है। अन्य मान्य (लेकिन अछूता) एनकोडिंग जो आउट-फ़ाइल का समर्थन करता है: [[-Encoding] {अज्ञात | स्ट्रिंग | यूनिकोड | bigendianunicode | utf8 | utf7 | utf32 | ascii | डिफ़ॉल्ट | oem}]। आप फ़ाइल को संग्रहित करने के लिए फ़ाइल को कुछ पाठ डेटा देने के लिए आउट-फ़ाइल में सामान भी पाइप कर सकते हैं, और एक-फ्लैप ध्वज भी। उदाहरण के लिए:

echo $null | Out-File .\stuff.txt -Encoding ascii -Append

यह उदाहरण किसी कारण से टाइमस्टैम्प को अपडेट नहीं करता है, लेकिन यह एक करता है:

echo foo | Out-File .\stuff.txt -Encoding ascii -Append

हालाँकि यह फ़ाइल के अंत में "फू" को जोड़ने का दुष्प्रभाव है।

यदि आप इस बारे में अनिश्चित हैं कि आपके पास कौन सी एन्कोडिंग है, तो मैंने पाया है कि वीएस-कोड में एक निफ्टी फीचर है, जहां निचले दाएं कोने में यह कहता है कि एन्कोडिंग क्या है। मुझे लगता है कि नोटपैड ++ में भी इसी तरह की सुविधा है।


Set-Content -Path $file -value $nullकाम करता है और यह फ़ाइल एन्कोडिंग को प्रभावित नहीं करता है। के ss64 संस्करण कीtouch भी जाँच करें ।
एंटोन क्राउग्लोव

3

आपके द्वारा वर्णित परिदृश्य के लिए (जब फ़ाइल मौजूद नहीं है), यह त्वरित और आसान है:

PS> sc example.txt $null

हालाँकि, अन्य सामान्य उपयोग touchफ़ाइल के टाइमस्टैम्प को अद्यतन करने के लिए है। यदि आप scइस तरह से मेरे उदाहरण का उपयोग करने का प्रयास करते हैं , तो यह फ़ाइल की सामग्री को मिटा देगा।


1
धन्यवाद! क्या scमतलब है? संपादित करें: यह समझ में आया ("सामग्री सेट करें")
15

2

विंडोज़ में एक खाली फ़ाइल बनाने के लिए, उपवास तरीका निम्नलिखित है:

fsutil file createnew file.name 0

शून्य को बाइट्स में फाइल किया जाता है, इसलिए यह बड़ी फ़ाइल बनाने के लिए भी उपयोगी है (वे संपीड़न का परीक्षण करने के लिए उपयोगी नहीं होंगे क्योंकि उनमें वास्तविक डेटा नहीं होता है और बहुत अधिक कुछ भी नहीं होगा)


2

वेबपेज http://xahlee.info/powershell/PowerShell_for_unixer.html बताता है:

new-item -type file [filename]

और यह वास्तव में आकार शून्य की एक नई फ़ाइल बनाता है।

यह यूनिक्स के दूसरे फ़ंक्शन को प्रदर्शित नहीं करता है touch, अर्थात् टाइमस्टैम्प को अपडेट करने के लिए यदि फ़ाइल नाम पहले से मौजूद है, लेकिन सवाल यह है कि उपयोगकर्ता सिर्फ नोटपैड का सहारा लिए बिना एक जीरो-आकार की फ़ाइल बनाना चाहता है।


1

मैंने "राइट-फाइल" नाम का उपयोग किया है क्योंकि "टच" एक अनुमोदित पावरस्लैब क्रिया नहीं है । मैं अभी भी इसे स्पर्श के रूप में उर्फ ​​करता हूं।

Touch.psm1

<#
 .Synopsis
  Creates a new file or updates the modified date of an existing file.

 .Parameter Path
  The path of the file to create or update.
#>
Function Write-File {
    [CmdletBinding()]
    Param(
       [Parameter( Mandatory=$True, Position=1 )]
       [string] $Path,
       [switch] $WhatIf,
       [System.Management.Automation.PSCredential] $Credential
    )
    $UseVerbose = $PSCmdlet.MyInvocation.BoundParameters['Verbose'].IsPresent -eq $True
    $UseDebug = $PSCmdlet.MyInvocation.BoundParameters['Debug'].IsPresent -eq $True
    $TimeStamp = Get-Date
    If( -Not [System.Management.Automation.WildcardPattern]::ContainsWildcardCharacters( $Path ) ) {
        New-Item -ItemType:File -Verbose:$UseVerbose -Debug:$UseDebug -WhatIf:$WhatIf -Credential $Credential -Path $Path -ErrorAction SilentlyContinue -Confirm:$False | Out-Null
    }
    Set-ItemProperty -Verbose:$UseVerbose -Debug:$UseDebug -WhatIf:$WhatIf -Credential $Credential -Path $Path -Name LastWriteTime -Value:$TimeStamp -Confirm:$False | Out-Null
}

Set-Alias -Name touch -Value Write-File

Export-ModuleMember -Function Write-File
Export-ModuleMember -Alias touch

उपयोग:

Import-Module ./Touch.psm1
touch foo.txt

समर्थन करता है:

  • अन्य निर्देशिकाओं में पथ
  • Credential नेटवर्क रास्तों के लिए
  • Verbose, Debugऔर WhatIfझंडे
  • वाइल्डकार्ड (केवल टाइमस्टैम्प अपडेट)

New-Itemआदेश चार पिछले जवाब में की पेशकश की गई है। आपने इसके लिए 20 लाइन का रैपर उपलब्ध कराया है। क्या आप थोड़ा और स्पष्ट रूप से बता सकते हैं कि आपके समाधान से पहले वाले लोगों को क्या फायदा हुआ है? उदाहरण के लिए, क्या इन कर रहे हैं Verbose, Debugऔर WhatIfझंडे, आदि?
स्कॉट

इस उत्तर के बीच एक महत्वपूर्ण अंतर यह New-Itemहै कि यह मौजूदा फ़ाइलों के टाइमस्टैम्प को अद्यतन करता है।
jpaugh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.