主頁 > 知識(shí)庫 > PowerShell中運(yùn)行CMD命令的技巧總結(jié)(解決名稱沖突和特殊字符等問題)

PowerShell中運(yùn)行CMD命令的技巧總結(jié)(解決名稱沖突和特殊字符等問題)

熱門標(biāo)簽:地圖標(biāo)注審核周期 電話機(jī)器人對家居行業(yè)幫助大嗎 AI智能電銷機(jī)器人壞處 沈陽ai電銷智能機(jī)器人 如何申請400的電話呀 黑暗之魂3地圖標(biāo)注 合肥電銷外呼系統(tǒng)供應(yīng)商 蘭州電銷機(jī)器人加盟 電商外呼系統(tǒng)排名

引言

我從老舊的 CMD.EXE 命令行換到優(yōu)秀的 POWSERSHELL.EXE 已經(jīng)有一段時(shí)間啦。您可能知道新的 Windows PowerShell 可以運(yùn)行任何舊命令。不過有些舊命令的名稱或語法可能會(huì)產(chǎn)生問題。但這都不是事兒。

麻煩 1:名稱沖突

PowerShell 的 cmdlet 別名和舊命令的名稱有沖突是個(gè)常見的問題。比如說您喜歡的服務(wù)控制命令 SC.EXE。SC.EXE 非常靈活!我能理解您為什么喜歡它(不要為用 NET.EXE 管理服務(wù)找借口)。如果您想查看 SMB Server 服務(wù)的狀態(tài),可以在 CMD.EXE 里這樣用:

復(fù)制代碼 代碼如下:

C:\&;SC QUERY LANMANSERVER

SERVICE_NAME: LANMANSERVER
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0


如果您在 PowerShell 中嘗試同樣的事,會(huì)得到:
復(fù)制代碼 代碼如下:

PS C:\&; SC QUERY LANMANSERVER
Set-Content : Access to the path 'C:\QUERY' is denied.
At line:1 char:1
+ SC QUERY LANMANSERVER
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\QUERY:String) [Set-Content], UnauthorizedAccessException
+ FullyQualifiedErrorId : GetContentWriterUnauthorizedAccessError,Microsoft.PowerShell.Commands.SetContentCommand

因?yàn)?SC 是 Set-Content 的別名。它優(yōu)先于 SC.EXE 文件。

方案 1A:使用 .EXE 擴(kuò)展名

為了克服這個(gè)問題,您可以簡單地將 .EXE 擴(kuò)展名包含進(jìn)舊命令。這消除了歧義并使相同的命令在 CMD.EXE 和 PowerShell 里都能用。還可以清楚告訴使用您腳本的人這里用的是舊 .EXE 命令而非 PowerShell 別名。

復(fù)制代碼 代碼如下:
PS C:\&; SC.EXE QUERY LANMANSERVER

SERVICE_NAME: LANMANSERVER
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

方案 1B:使用 CMD /C

另一個(gè)辦法是把您的命令用引號(hào)括起讓 CMD.EXE 來運(yùn)行。但這樣做沒啥效率,僅僅為了執(zhí)行您的命令就得運(yùn)行一個(gè) CMD.EXE 實(shí)例。

復(fù)制代碼 代碼如下:
PS C:\&; CMD /C "SC QUERY LANMANSERVER"

SERVICE_NAME: LANMANSERVER
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

方案 1C:用等效的 PowerShell

很多情況下,可以用 PowerShell cmdlet 來代替您的舊命令。
例如這里您就可以直接使用 Get-Service:

復(fù)制代碼 代碼如下:

PS C:\&; Get-Service LANMANSERVER | FL

Name : LANMANSERVER
DisplayName : Server
Status : Running
DependentServices : {Browser}
ServicesDependedOn : {SamSS, Srv}
CanPauseAndContinue : True
CanShutdown : False
CanStop : True
ServiceType : Win32ShareProcess


麻煩 2:PowerShell 的特殊字符

有時(shí)舊命令的參數(shù)使用的字符在 PowerShell 里有特殊意義。
比如您想讓某個(gè)目錄被所有用戶完全控制。在 CMD.EXE 里您可以這樣做:

復(fù)制代碼 代碼如下:

C:\&;ICACLS.EXE C:\TEST /GRANT USERS:(F)
processed file: C:\TEST
Successfully processed 1 files; Failed processing 0 files

在 CMD.EXE 做這些沒問題,但如果你在 PowerShell 運(yùn)行就會(huì)報(bào)錯(cuò):
復(fù)制代碼 代碼如下:

PS C:\&; ICACLS.EXE C:\TEST /GRANT USERS:(F)
The term 'F' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling
of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:34
+ ICACLS.EXE C:\TEST /GRANT USERS:(F)
+ ~
+ CategoryInfo : ObjectNotFound: (F:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundExceptionn

試圖給名字以 $ 結(jié)尾的電腦對象授權(quán)時(shí)也會(huì)引起一個(gè)類似的錯(cuò)誤。
復(fù)制代碼 代碼如下:

PS C:\&; ICACLS.EXE C:\TEST /GRANT COMPUTERNAME$:(F)
At line:1 char:39
+ ICACLS.EXE C:\TEST /GRANT COMPUTERNAME$:(F)
+ ~~
Invalid variable reference. '$' was not followed by a valid variable name character. Consider using ${} to delimit the
name.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : InvalidVariableReference

這個(gè)問題是因?yàn)槔ㄌ?hào)和美元符在 PowerShell 中都有特殊意義。例如大括號(hào)之類常用字符也會(huì)引發(fā)相似的沖突。也有幾種不同的方案來解決這個(gè)問題。

方案 2A:使用 CMD /C

和第一個(gè)問題一樣,你可以引號(hào)括起您的命令交給 CMD.EXE 來處理。先不考慮效率,PowerShell 不會(huì)去解析引號(hào)里的字符串,這樣就能正常工作。

復(fù)制代碼 代碼如下:

PS C:\&; CMD.EXE /C "ICACLS.EXE C:\TEST /GRANT USERS:(F)"
processed file: C:\TEST
Successfully processed 1 files; Failed processing 0 files

方案 2B:使用 PowerShell 的轉(zhuǎn)義字符

對于這個(gè)方案,您必須先知道使用的字符哪些對 PowerShell 有特殊意義。然后在它們每一個(gè)前面加上個(gè)反引號(hào)(`),它就是 PowerShell 的轉(zhuǎn)義字符。這個(gè)方案的主要問題是你必須知道哪些字符需要轉(zhuǎn)義,這讓讀寫您的腳本更困難。
我們的例子里,你需要處理 ( 和 ) 這兩個(gè)字符:

復(fù)制代碼 代碼如下:

PS C:\&; ICACLS.EXE C:\TEST /GRANT USERS:`(F`)
processed file: C:\TEST
Successfully processed 1 files; Failed processing 0 files


方案 2C:使用 PowerShell v3 的新語法“–%”

在 PowerShell v3 中有另一種選擇來解決這個(gè)問題。您只需在命令行的任意位置添加 –% 序列(兩個(gè)短劃線和一個(gè)百分號(hào))PowerShell 就不會(huì)再去解析剩下的部分。
我們的例子里,您可以這樣用:

復(fù)制代碼 代碼如下:

PS C:\&; ICACLS.EXE --% C:\TEST /GRANT USERS:(F)
processed file: C:\TEST
Successfully processed 1 files; Failed processing 0 files

也可以這樣用:
復(fù)制代碼 代碼如下:

PS C:\&; ICACLS.EXE C:\TEST --% /GRANT USERS:(F)
processed file: C:\TEST
Successfully processed 1 files; Failed processing 0 files

方案 2D:使用等效的 PowerShell

使用等效的 PowerShell 也是種選擇。ICACLS.EXE 可以用 Set-ACL 代替??梢詮倪@篇博客中找到更多的 Set-ACL 例子。

混搭

這里展示如何讓您安全地享受 PowerShell 結(jié)合您的舊命令帶來的靈活性。您可能會(huì)學(xué)到幾個(gè)技巧并以全新的方式開始新老結(jié)合。

例如您能用靈活的 Get-Service 通配符代替 SC.EXE 里晦澀選項(xiàng):

復(fù)制代碼 代碼如下:
Get-Service LAN* | % { $_.Name; SC.EXE SDSHOW $_.Name }

或者您可以使用 PowerShell 的 Get-Item(別名 Dir)過濾文件子集傳遞給 ICACLS.EXE 來處理:
復(fù)制代碼 代碼如下:
DIR C:\TEST -Recurse | ? {$_.Length -ge 1MB} | % { ICACLS.EXE $_.FullName /Grant Administrator:`(F`) }

您甚至可以循環(huán)遍歷幾個(gè)數(shù)并結(jié)合好用的 FSUTIL.EXE 來創(chuàng)建一批大小不同的文件用于測試項(xiàng)目:
復(fù)制代碼 代碼如下:
1..100 | % { FSUTIL.EXE FILE CREATENEW C:\TEST\FILE$_.TXT ($_*10KB)


尾聲

事到如今,您可能已經(jīng)確信 Windows PowerShell 是管理員的好朋友啦。然而您可能因?yàn)橛行┡f命令帶著古怪的名字或參數(shù)而不能使用 POWERSHELL.EXE。我非常鼓勵(lì)您使用這些技巧來徹底停用 CMD.EXE 并永久遷移到 PowerShell 來作為您主要的 shell。

文章出處:http://www.pstips.net/using-windows-powershell-to-run-old-command-line-tools-and-their-weirdest-parameters.html

您可能感興趣的文章:
  • shell腳本中28個(gè)特殊字符的作用簡明總結(jié)
  • Shell腳本中的位置變量參數(shù)(特殊字符)實(shí)例講解
  • Shell腳本中的特殊字符(美元符、反斜杠、引號(hào)等)作用介紹
  • Shell命令行中特殊字符與其轉(zhuǎn)義詳解(去除特殊含義)

標(biāo)簽:黔南 常州 河北 河池 隴南 淮南 黔南 通遼

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PowerShell中運(yùn)行CMD命令的技巧總結(jié)(解決名稱沖突和特殊字符等問題)》,本文關(guān)鍵詞  PowerShell,中,運(yùn)行,CMD,命令,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PowerShell中運(yùn)行CMD命令的技巧總結(jié)(解決名稱沖突和特殊字符等問題)》相關(guān)的同類信息!
  • 本頁收集關(guān)于PowerShell中運(yùn)行CMD命令的技巧總結(jié)(解決名稱沖突和特殊字符等問題)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章