麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > PowerShell > 正文

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

2020-03-26 19:24:44
字體:
來源:轉載
供稿:網友

引言

我從老舊的 CMD.EXE 命令行換到優秀的 POWSERSHELL.EXE 已經有一段時間啦。您可能知道新的 Windows PowerShell 可以運行任何舊命令。不過有些舊命令的名稱或語法可能會產生問題。但這都不是事兒。

麻煩 1:名稱沖突

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

復制代碼 代碼如下:

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 中嘗試同樣的事,會得到:
復制代碼 代碼如下:

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

 

因為 SC 是 Set-Content 的別名。它優先于 SC.EXE 文件。

方案 1A:使用 .EXE 擴展名

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

 

復制代碼 代碼如下:
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

另一個辦法是把您的命令用引號括起讓 CMD.EXE 來運行。但這樣做沒啥效率,僅僅為了執行您的命令就得運行一個 CMD.EXE 實例。

 

復制代碼 代碼如下:
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:

復制代碼 代碼如下:

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 的特殊字符

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

復制代碼 代碼如下:

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

在 CMD.EXE 做這些沒問題,但如果你在 PowerShell 運行就會報錯:
復制代碼 代碼如下:

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

試圖給名字以 $ 結尾的電腦對象授權時也會引起一個類似的錯誤。
復制代碼 代碼如下:

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

 

這個問題是因為括號和美元符在 PowerShell 中都有特殊意義。例如大括號之類常用字符也會引發相似的沖突。也有幾種不同的方案來解決這個問題。

方案 2A:使用 CMD /C

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

復制代碼 代碼如下:

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 的轉義字符

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

復制代碼 代碼如下:

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

復制代碼 代碼如下:

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

也可以這樣用:
復制代碼 代碼如下:

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 結合您的舊命令帶來的靈活性。您可能會學到幾個技巧并以全新的方式開始新老結合。

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

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

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

您甚至可以循環遍歷幾個數并結合好用的 FSUTIL.EXE 來創建一批大小不同的文件用于測試項目:
復制代碼 代碼如下:
1..100 | % { FSUTIL.EXE FILE CREATENEW C:/TEST/FILE$_.TXT ($_*10KB)


尾聲

事到如今,您可能已經確信 Windows PowerShell 是管理員的好朋友啦。然而您可能因為有些舊命令帶著古怪的名字或參數而不能使用 POWERSHELL.EXE。我非常鼓勵您使用這些技巧來徹底停用 CMD.EXE 并永久遷移到 PowerShell 來作為您主要的 shell。

文章出處:http://www.pstips.net/using-windows-powershell-to-run-old-command-line-tools-and-their-weirdest-parameters.html
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品一区二区三区免费看 | 久久精品国产99国产精品亚洲 | 深夜毛片免费看 | 成人免费福利视频 | 午夜视频在线免费播放 | 日韩欧美电影一区二区三区 | 欧美精品v国产精品v日韩精品 | 国产91久久精品 | a级毛片免费观看在线播放 日本aaa一级片 | 国av在线 | 欧美日韩一区,二区,三区,久久精品 | 毛片视频免费观看 | 草b视频在线观看 | 久久久久久久高清 | 久草热久 | 日本aⅴ在线 | 日韩中字幕 | 国产pron| 久久久久国产成人免费精品免费 | 久久国产精品电影 | 欧美日韩网站在线观看 | 成人国产在线视频 | 色诱亚洲精品久久久久久 | 国产成人综合在线观看 | 免费a级作爱片免费观看欧洲 | 调教小男生抽打尿孔嗯啊视频 | 亚洲一区二区国产 | 黄色免费在线电影 | 成人wxx视频免费 | 国产va在线观看 | 性生活视频一级 | 一级毛片看 | 中国毛片在线观看 | 亚洲视频成人 | 午夜精品久久久久久久久久久久久蜜桃 | 免费一级毛片在线播放不收费 | 久草手机视频在线观看 | 51国产偷自视频区视频小蝌蚪 | 亚洲一区二区三区精品在线观看 | 精品亚洲视频在线 | 桥本有菜免费av一区二区三区 |