පවර්ෂෙල් සමඟ හිස් ගොනුවක් සෑදීමට ලිනක්ස් `ස්පර්ශයට 'සමානද? [අනුපිටපත]


186

පවර්ෂෙල් හි සමාන අගයක් touchතිබේද?

උදාහරණයක් ලෙස ලිනක්ස් හි මට ආයාචනා කිරීමෙන් නව හිස් ගොනුවක් සෑදිය හැකිය:

touch filename

වින්ඩෝස් හි මෙය ඉතා අමුතුයි - සාමාන්‍යයෙන් මම නොට්පෑඩ් හි නව අවස්ථාවක් විවෘත කර හිස් ගොනුවක් සුරකිමි.

මෙය සිදු කිරීම සඳහා පවර්ෂෙල් හි ක්‍රමලේඛන ක්‍රමයක් තිබේද?

මම ස්පර්ශයේ හැසිරීමට හරියටම ගැලපෙන ලෙස නොව, හිස් ලිපිගොනු නිර්මාණය කිරීම සඳහා හැකි සරලම සමාන දේ සොයා ගැනීමට ය.



1
ස්තූතියි. මම ඔවුන් දෙස බැලුවෙමි, නමුත් බොහෝ පිළිතුරු විධාන විමසුමට යොමු වේ. නව යෙදුම් ස්ථාපනය කිරීමට මට අවශ්‍ය නොවන පවර්ෂෙල් විසඳුමක් ලබා ගැනීමට මම කැමතියි.
jsalonen

ප්‍රශ්නය අවතක්සේරු කර ඇත - විශේෂාංග දෙකම තවත් කේත පේළි කිහිපයක් පමණි, දෙකම ක්‍රියාත්මක කරන්න, අඩක් පමණක් නොව, එස්පී. අතුරුදහන් වූ අනෙක් විධානය එතරම් භයානක වන විට.
yzorg

zyzorg: විශේෂාංග දෙකෙන්ම ඔබ අදහස් කරන්නේ කුමක්ද? මම ඇසුවේ ඔබට touchලිනක්ස් සමඟ කළ හැකි ආකාරයට PS හි හිස් ගොනුවක් සාදා ගන්නේ කෙසේද යන්නයි .
jsalonen

sjsalonen touchදැනට පවතින ගොනුවක * නික්ස් භාවිතා කරන්න, එය ගොනුව වෙනස් නොකර අවසන් ලිවීමේ වේලාව යාවත්කාලීන කරනු ඇත, @amiregelz වෙතින් සබැඳි බලන්න. මෙම ප්‍රශ්නයට ඉහළ ගූගල් ශ්‍රේණිගත කිරීමක් ඇත powershell touch, * නික්ස් ස්පර්ශය නොමැති විට, එයින් අඩක් පමණක් දත්ත විනාශ කළ හැකි බවට පිටපත් / පේස්ට් කරන්නන් දැනුවත් කිරීමට මට අවශ්‍ය විය. ගොනුව දැනටමත් පවතින විට හසුරුවන @LittleBoyLost පිළිතුර බලන්න.
yzorg

Answers:


176

උපග්‍රන්ථ යළි-යොමුවීම් භාවිතා කිරීමෙන් ">>" පවතින ගොනුවක් මකා දැමූ ගැටළුව විසඳයි:

echo $null >> filename

3
විධාන විමසුමේ සිට 'echo null> filename' ලෙසද හැඳින්වේ, සමහර විට කණ්ඩායම් ගොනුවක්. එහි පවර්ෂෙල් අනුවාදය බැලීමට සිසිල්, ස්තූතියි!
මාර්ක් ඇලන්

18
ගොනුව දැනටමත් තිබේ නම් ස්පර්ශය මීට වඩා වෙනස් වේ
jk.

11
echo එක අනවශ්‍යයි, $null > filenameවිශිෂ්ටයි.
alirobe

12
මෙය මා වෙනුවෙන් යුනිකෝඩ් BOM 0xFEFF බයිට් 2 ක් ලියයි.
mlt

6
වැදගත් සටහන: බොහෝ යුනික්ස් මෙවලම් BOM සමඟ ගනුදෙනු නොකරයි. මෙයට git ඇතුළත් වේ (කවුළු වල පවා). BOM හඳුනා නොගන්නා මෙවලම් සමඟ ඔබ මේ ආකාරයෙන් සාදන ලද ගොනු භාවිතා කරන්නේ නම් ඔබට ගැටළු ඇති වේ. උදා: ඔබ .gitignoreමෙම විධානය භාවිතා කර නිර්මාණය කිරීමට උත්සාහ කර එය ක්‍රියාත්මක නොවන්නේ මන්දැයි කල්පනා කරන්න. BOM හේතුවයි.
මාර්ටිසි

122

හිස් ගොනුවක් සෑදීමට:

New-Item -ItemType file example.txt

ගොනුවක කාලරාමුව යාවත්කාලීන කිරීම සඳහා:

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

6
මම හිතන්නේ මෙය හොඳම ප්‍රවේශයයි!
ජයෂ් භූත්

ෆෝල්ඩරයක කාලරාමුව යාවත්කාලීන කිරීම සඳහා මෙය ක්‍රියා කරයිද?
riahc3

1
@ riahc3, මෙය භාවිතා කරන්න : (gi MyFolder).LastWriteTime = Get-Date. ඔබට එය ගොනු සඳහාද භාවිතා කළ හැකිය.
dangph

12
ඊටත් වඩා කණගාටුදායකයි:ni example.txt
නික් කොක්ස්

3
මෙම ක්‍රමය මඟින් භයානක BOM බයිට් එකතු නොකරන අතර කේතීකරණය සතුටින් UTF-8 ලෙස පෙනේ.
ඩාවෝස්

79

මෙන්න නව ගොනුවක් නොපවතින නම් එය නිර්මාණය කරන හෝ කාලරාමුව යාවත්කාලීන කරන්නේ නම් එය යාවත්කාලීන කරයි.

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
යුනික්ස් ස්පර්ශ වැඩසටහන (වෙනත් නමකින් වුවද) ප්‍රතිවර්තනය කිරීම සඳහා නිවැරදි පිළිතුර මෙයයි, නමුත් ප්‍රශ්නය නැඹුරු වන්නේ හුදෙක් නව ගොනුවක් සෑදීම සඳහා ය.
ජේමි ෂෙම්බ්‍රි

16
ඉතා, ඉතා කුඩා තර්ක: ප්රාදේශීය සභාවේ Verb-නාම පදයක් නම් සමුළුවට ටච්-ගොනුව අනුකූල අතර, Touch: නොවේ නම් එය සැලකිය යුතු අවශ්යතාවය තියෙන්නේ නෑ බව "අනුමත" ක්රියා පදය (වේ msdn.microsoft.com/en-us/library/ms714428. aspx ). 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

හොඳයි, නමුත් ඒ New-Item $fileවෙනුවට භාවිතා කිරීම වඩා හොඳය echo $null > $file, මන්දයත් වින්ඩෝස් පවර්ෂෙල් හි UTF-16LE BOM සමඟ බයිට් 2 ක ගොනුවක් නිර්මාණය කරනු ඇත (නමුත් තවදුරටත් පවර්ෂෙල් කෝර් හි නැත).
mklement0

මෙය TOCTTOU තරඟයක් ඇත, චෙක්පත සහ ක්‍රියාව අතර ගොනුව නිර්මාණය කළ හැකිය.
poizan42

24

පවර්ෂෙල් හි ඔබට සමාන ස්පර්ශ ශ්‍රිතයක් නිර්මාණය කළ හැකිය:

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

භාවිතය:

touch myfile.txt

මූලාශ්රය


මෙය නියමයි, ස්තූතියි! මට අවශ්‍ය දේ! මම කවචය ආරම්භ කරන විට එය ස්වයංක්‍රීයව පූරණය වන පරිදි මෙම කාර්යය පවර්ෂෙල් තුළට ස්ථාපනය කරන්නේ කෙසේදැයි යම් අදහසක් තිබේද?
jsalonen

2
එය ඔබගේ $ පැතිකඩ ගොනුවට එක් කරන්න. (එම ගොනුව සංස්කරණය කිරීමට නොට්පෑඩ් $ පැතිකඩ ධාවනය කරන්න.)
මාර්ක් ඇලන්

28
මෙමඟින් ගොනුවේ අන්තර්ගතය තිබේ නම් එය මකා දැමෙනු ඇත.
dangph

1
නැතහොත් පවතින ගොනු අන්තර්ගතයන් ඉවත් නොකරන ආරක්ෂිත අනුවාදය function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }
alastairtree

16

මම කැමතියි

fc > filename

මෙම කාර්යය සඳහා. ඔබට භාවිතා කළ හැකි හිස් නොවන ගොනු සමඟ වැඩ කිරීමට

fc >> filename

fcආකෘති-අභිරුචි සඳහා අන්වර්ථයකි . මම එය තෝරාගත්තේ එය කෙටි විධානයක් නිසා මෙම සන්දර්භය තුළ කිසිවක් නොකරන නිසාය . ඔබ නැවත හරවා යැවීම අමතක කළහොත් එය ද හොඳයි

fc filename

ඔබට දෝෂයක් ලබා දෙනවා වෙනුවට, එය නැවත කිසිවක් නොකරයි. වැඩ කරන තවත් අන්වර්ථ නාමයන් වේ

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

12

දැනටමත් වටිනා පිළිතුරු පොකුරක් ඇත, නමුත් මම නව අයිතමයේ අන්වර්ථ නාමයට කැමතියි: එය නිකම්: නි

ඔබට ගොනු වර්ග ප්‍රකාශය අත්හැර දැමිය හැකිය (දිගුවක් එකතු කළ විට එය ගම්‍ය වේ යැයි මම සිතමි), එබැවින් මගේ වත්මන් නාමාවලියෙහි 'x' නමින් ජාවාස්ක්‍රිප්ට් ගොනුවක් සෑදීමට මට සරලව ලිවිය හැකිය:

ni x.js

ස්පර්ශයට වඩා වේගයෙන් අක්ෂර 3 ක්!


1
මෙය අනර්ථකාරී නොවේni : The file 'x.js' already exists
ස්ටීවන් පෙන්

පරමාදර්ශී සමානකමක් වනු ඇතac x.js $null
නික් කොක්ස්

8

මම විවිධ ප්‍රභවයන් එකතු කර, මගේ අවශ්‍යතා සපුරාලන පහත සඳහන් දෑ සමඟ කතා කළෙමි. වෙනත් කාල කලාපයක යන්ත්‍රයක් මත ගොඩනගා ඇති ඩීඑල්එල් හි ලිවීමේ දිනය නියම කිරීමට මට අවශ්‍ය විය:

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

ඇත්ත වශයෙන්ම, ඔබට එය බහු ගොනු සඳහාද සැකසිය හැකිය:

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

1
ස්පර්ශක විධානයෙහි නව ගොනු නිර්මාණය කිරීමේ ලක්ෂණය කෙරෙහි ප්‍රශ්නය යොමු වුවද, ගොනුවක් මත LastWriteTime වෙනස් කිරීමට වඩාත්ම පවර්ෂෙල්-ඊෂ් ක්‍රමය සඳහා +1.
නේතන් හාර්ට්ලි

විචල්යයක් භාවිතා නොකර?
riahc3

6

මෙහි ඇති පිළිතුරු සමූහයක් ගොනු කේතන ක්‍රමයට ගණන් නොගන්නා බව පෙනේ.

වෙනත් හේතු නිසා මම මේ ගැටලුවට මුහුණ දුන්නා, නමුත්

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 ගොනුවක් ලබා දෙයි. අවුට්-ෆයිල් සහාය දක්වන වෙනත් වලංගු (නමුත් පරීක්ෂා නොකළ) කේතීකරණ: [[-එන්කෝඩින්] {නොදන්නා | නූල් | යුනිකෝඩ් | bigendianunicode | utf8 | utf7 | utf32 | ascii | පෙරනිමි | oem}]. ගොනුව ගබඩා කිරීම සඳහා යම් පෙළ දත්ත ලබා දීම සඳහා ඔබට පිට-ගොනුව වෙත පයිප්ප දැමිය හැකිය. උදාහරණයක් වශයෙන්:

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

මෙම උදාහරණය කිසියම් හේතුවක් නිසා කාලරාමුව යාවත්කාලීන නොකරයි, නමුත් මෙය කරන්නේ:

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

එය ගොනුවේ අවසානයට "foo" එකතු කිරීමේ අතුරු ආබාධයක් ඇතත්.

ඔබ සතුව ඇති කේතනාංකය පිළිබඳව ඔබට සැකයක් ඇත්නම්, VS-Code හි නව අංගයක් ඇති බව මට පෙනී ගොස් ඇති අතර පහළ දකුණු කෙළවරේ එය කේතනය යනු කුමක්දැයි පවසයි. මම හිතන්නේ නොට්පෑඩ් ++ ට ද ඒ හා සමාන අංගයක් ඇත.


Set-Content -Path $file -value $nullකාර්යය කරන අතර එය ගොනු කේතන ක්‍රමයට බලපාන්නේ නැත. හි ss64 අනුවාදයදtouch පරීක්ෂා කරන්න .
ඇන්ටන් කෘග්ලොව්

ඔව්, වින්ඩෝස් පවර්ෂෙල් හි $null > $fileඅවාසනාවකට UTF-16LE කේතීකරණය සමඟ බයිට් 2 ගොනුවක් සාදයි; වාසනාවකට මෙන්, පවර්ෂෙල් කෝර් හි ඔබ දැන් New-Itemසංස්කරණ දෙකෙහිම කරන ආකාරයට සැබවින්ම හිස් ගොනුවක් ලබා ගනී . කෙසේ වෙතත්, යූටීඑෆ් -8 වැනි නිශ්චිත අක්ෂර කේතීකරණයක් ඇති බව සැබවින්ම හිස් ගොනුවක් (බයිට් 0 ක දිග) ගැන කථා කිරීම අර්ථවත් නොවේ. අක්ෂර කේතීකරණය අර්ථවත් වන්නේ අන්තර්ගතයට සාපේක්ෂව (මෙහි නැතිවී ඇති) සහ වඩාත් නිශ්චිතවම පෙළ අන්තර්ගතයට සාපේක්ෂව ය .
mklement0

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

ගොනු අන්තර්ගතයන් මකා නොදමන නමුත් එය දිනය යාවත්කාලීන නොකරනු ඇත.


3

ඔබ විස්තර කළ අවස්ථාව සඳහා (ගොනුව නොපවතින විට), මෙය ඉක්මන් හා පහසු ය:

PS> sc example.txt $null

කෙසේ වෙතත්, අනෙක් පොදු භාවිතය touchවන්නේ ගොනුවේ කාලරාමුව යාවත්කාලීන කිරීමයි. ඔබ මගේ scඋදාහරණය ඒ ආකාරයෙන් භාවිතා කිරීමට උත්සාහ කළහොත් , එය ගොනුවේ අන්තර්ගතය මකා දමනු ඇත.


2
ස්තූතියි! එයින් scඅදහස් කරන්නේ කුමක්ද? සංස්කරණය කරන්න: එය
හදුනාගෙන

2

කවුළුවල හිස් ගොනුවක් සෑදීමට, නිරාහාර ක්‍රමය පහත දැක්වේ:

fsutil file createnew file.name 0

බිංදුව බයිට් වලින් ගොනු කර ඇත, එබැවින් මෙය විශාල ගොනුවක් සෑදීමට ද ප්‍රයෝජනවත් වේ (ඒවා සත්‍ය දත්ත අඩංගු නොවන බැවින් සම්පීඩනය පරීක්ෂා කිරීමට ඒවා ප්‍රයෝජනවත් නොවනු ඇත.


2

Http://xahlee.info/powershell/PowerShell_for_unixer.html වෙබ් පිටුව යෝජනා කරන්නේ:

new-item -type file [filename]

මෙය සැබවින්ම ශුන්‍ය ප්‍රමාණයේ නව ගොනුවක් නිර්මාණය කරයි.

මෙය යුනික්ස් හි අනෙක් කාර්යය ඉටු නොකරයි touch, එනම් ගොනු නාමය දැනටමත් තිබේ නම් කාලරාමුව යාවත්කාලීන කිරීම , නමුත් ප්‍රශ්නයෙන් ඇඟවෙන්නේ පරිශීලකයාට නොට්පෑඩ් වෙත නොයා අන්තර්ක්‍රියාකාරීව ශුන්‍ය ප්‍රමාණයේ ගොනුවක් නිර්මාණය කිරීමට අවශ්‍ය බවයි.


2

"ස්පර්ශය" අනුමත පවර්ෂෙල් ක්‍රියාපදයක් නොවන නිසා මම "ලිවීම-ගොනුව" යන නම භාවිතා කළෙමි . කෙසේ වෙතත්, මම එය තවමත් ස්පර්ශය ලෙස අන්වර්ථ කරමි.

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ආදිය කොඩි?
ස්කොට්

1
මෙම පිළිතුර අතර ඇති එක් වැදගත් වෙනසක් සහ New-Itemමෙය දැනට පවතින ලිපිගොනු වල කාලරාමුව යාවත්කාලීන කිරීමයි.
jpaugh

කිසියම් හේතුවක් නිසා, මට සෑම විටම නැවත නැවතත් මොඩියුලය ආනයනය කළ යුතුය, මෙය සිදු නොවිය යුතුය, හරි ආනයන-මොඩියුලය ./Touch.psm1
shirish

1
ir ෂිරිෂ් ඔබ සෑම සැසියක්ම මොඩියුල ආනයනය කළ යුතුය, ඔව්, ඔබ එය PSModulePath හි ෆෝල්ඩරයකට දැමුවේ නැත්නම්. (නැතහොත් එහි ෆෝල්ඩරය PSModulePath වෙත එක් කරන්න.)
SilverbackNet
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.