سؤال ما يعادل نظام التشغيل Linux 'touch` لإنشاء ملف فارغ مع PowerShell؟ [مكرر]


هذا السؤال لديه بالفعل إجابة هنا:

في PowerShell هناك ما يعادل touch؟

على سبيل المثال ، في Linux ، يمكنني إنشاء ملف فارغ جديد من خلال استدعاء:

touch filename

في Windows ، هذا أمر محرج - عادةً ما أقوم فقط بفتح نسخة جديدة من المفكرة وحفظ ملفًا فارغًا.

هل هناك طريقة برنامجية في PowerShell للقيام بذلك؟

أنا لا أتطلع إلى مطابقة سلوك اللمس تمامًا ، ولكن فقط للعثور على أبسط معادل ممكن لإنشاء ملفات فارغة.


135
2017-11-07 19:28


الأصل


نرى نسخة ويندوز من قيادة اللمس يونيكس و ما يعادل ويندوز لأمر لينكس "لمسة"؟ - amiregelz
شكر. نظرت إليهم ، لكن معظم الإجابة تركز على الأوامر. أود الحصول على حل PowerShell لا يتطلب مني تثبيت تطبيقات جديدة. - jsalonen
تحققت من السؤال - فكلتا الميزتين ليست سوى بضعة أسطر من الشفرة ، فقط قم بتنفيذ كلاهما ، وليس فقط النصف ، esp. عندما يكون الأمر النصف الآخر المفقود شديد الخطورة. - yzorg
yzorg: ماذا تقصد بكلتا الميزتين؟ كنت أسأل فقط كيفية إنشاء ملف فارغ في PS بالطريقة التي يمكنك القيام به touch في لينكس. - jsalonen
jsalonen استخدم * لا يوجد touch في ملف موجود سيقوم بتحديث آخر وقت للكتابة دون تعديل الملف ، راجع الارتباطات منamiregelz. هذا السؤال له ترتيب جوجل عالية ل powershell touchأردت التنبيه إلى النسخ / اللصوص التي يمكن لهذا الجزء فقط من تدمير البيانات ، عندما لا تعمل * nix touch. راجع الإجابةLittleBoyLost التي تتعامل عندما يكون الملف موجودًا بالفعل. - yzorg


الأجوبة:


استخدام "معيد التوجيه" الملحق ">>" يحل المشكلة حيث يتم حذف ملف موجود:

echo $null >> filename

141
2017-11-07 19:36



يُعرف أيضًا باسم 'echo null> filename' من موجه الأوامر ، وربما ملف دفعي. رائع لمشاهدة نسخة PowerShell منه ، شكرًا! - Mark Allen
اللمس مختلف عن هذا إذا كان الملف موجودًا بالفعل - jk.
صدى غير ضروري ، $null > filename يعمل بشكل رائع - alirobe
هذا يكتب 2 بايت من unicode BOM 0xFEFF بالنسبة لي. - mlt
ملاحظة هامة: لا تتعامل العديد من أدوات unix مع قائمة المواد. وهذا يشمل بوابة على سبيل المثال (حتى على النوافذ). ستواجه مشاكل إذا كنت تستخدم ملفات تم إنشاؤها بهذه الطريقة باستخدام أدوات لا تتعرف على BOMs. مثلا تحاول ان تخلق .gitignore باستخدام هذا الأمر ونتساءل لماذا لن ينجح. BOM هو السبب. - martixy


في ما يلي إصدار ينشئ ملفًا جديدًا إذا لم يكن موجودًا أو يحدِّث الطابع الزمني إذا كان موجودًا.

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

74
2018-03-25 12:47



هذه هي الإجابة الصحيحة لتكرار برنامج اللمس Unix (وإن كان باسم مختلف) ، ولكن السؤال موجه ببساطة لإنشاء ملف جديد. - Jamie Schembri
للغاية، للغاية ممحاة صغيرة: بينما يتطابق ملف Touch-File مع اصطلاح تسمية Verb-Noun لـ PS ، Touch ليس فعلًا "معتمدًا" (ليس هذا شرطًا مهمًا: msdn.microsoft.com/en-us/library/ms714428.aspx). File على ما يرام ، راجع للشغل. أوصي الأسماء Set-File أو Set-LastWriteTime أو ، المفضل لدي ، Update-File. أيضا ، أود أن أوصي Add-Content $file $null بدلا من echo $null > $file. أخيرًا ، عيّن اسمًا مستعارًا مع Set-Alias touch Update-File إذا كنت تريد الاستمرار في استخدام الأمر touch - Alan McBee


لإنشاء ملف فارغ:

New-Item -ItemType file example.txt

لتحديث الطابع الزمني لملف:

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

68
2018-01-24 06:39



أعتقد أن هذا هو أفضل نهج! - Jayesh Bhoot
هل يعمل هذا على تحديث الطابع الزمني للمجلد؟ - riahc3
@ riahc3 ، استخدم هذا: (gi MyFolder).LastWriteTime = Get-Date . يمكنك استخدام ذلك للملفات أيضًا. - dangph
أكثر بليغة: ni example.txt - Nick Cox
لا تضيف هذه الطريقة بايت BOM الفظيع ويبدو أن الترميز يبدو UTF-8. - Davos


في PowerShell ، يمكنك إنشاء وظيفة Touch مشابهة على هذا النحو:

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

الاستعمال:

touch myfile.txt

مصدر


24
2017-11-07 19:32



هذا رائع ، شكراً! فقط ما أريد! أي أفكار حول كيفية تثبيت هذه الوظيفة في PowerShell بحيث يتم تحميلها تلقائيًا عند بدء تشغيل shell؟ - jsalonen
أضفه إلى ملفك الشخصي في الملف الشخصي. (قم بتشغيل ملف تعريف notepad $ لتحرير هذا الملف.) - Mark Allen
سيؤدي هذا إلى حذف محتويات الملف إذا كان موجودًا. - dangph
أو الإصدار الآمن الذي لا يخرج محتويات الملفات الموجودة function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } } - alastairtree


أنا أفضل

fc > filename

لهذه المهمة. للعمل مع الملفات غير الفارغة التي يمكنك استخدامها

fc >> filename

fc هو ببساطة اسم مستعار ل الشكل مخصص. اخترتها لأنه أمر قصير لا يفعل شيئًا في هذا السياق ، NOOP. إنه أيضا لطيف لأنه إذا نسيت إعادة توجيه

fc filename

بدلاً من إعطائك خطأ ، مرة أخرى لا يفعل شيئًا. بعض الأسماء المستعارة الأخرى التي ستعمل هي

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

10
2017-09-30 05:10





أنا وضعت مصادر مختلفة ، وانتهى الأمر مع ما يلي ، التي تلبي احتياجاتي. أحتاج إلى تعيين تاريخ كتابة ملف DLL الذي تم إنشاؤه على جهاز في منطقة زمنية مختلفة:

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

بالطبع ، يمكنك أيضًا تعيينها لملفات متعددة:

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

8
2018-01-26 00:33



إجراء 1+ لطريقة Powershell-ish لتغيير LastWriteTime في ملف (وهو ما احتاجه) ، على الرغم من أن السؤال يركز على ميزة إنشاء الملفات الجديدة لأمر اللمس. - Nathan Hartley
دون استخدام متغير؟ - riahc3


هناك بالفعل مجموعة من الإجابات الجديرة بالاهتمام ، لكنني أحب الاسم المستعار لعنصر جديد وهو فقط: ni

يمكنك أيضًا التخلي عن تصريح نوع الملف (الذي أفترض أنه ضمني عند إضافة امتداد) ، لذلك لإنشاء ملف javascript باسم "x" في الدليل الحالي ، يمكنني ببساطة كتابة:

ni x.js

3 أحرف أسرع من اللمس!


7
2018-06-15 16:45



هذا ليس عديم القوة ni : The file 'x.js' already exists - Steven Penny


افتح ملف ملفك الشخصي:

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

4
2018-03-08 12:47