বিঃদ্রঃ:
নিম্নলিখিত সমাধানটি যে কোনও বাহ্যিক প্রোগ্রামের সাথে কাজ করে এবং আউটপুটটিকে টেক্সট হিসাবে অবিচ্ছিন্নভাবে ক্যাপচার করে ।
আর একটি পাওয়ারশেল উদাহরণ হিসাবে প্রার্থনা করতে এবং এর আউটপুটটি সমৃদ্ধ বস্তু (সীমাবদ্ধতা সহ) হিসাবে ক্যাপচার করতে নীচের অংশে বৈকল্পিক সমাধানটি দেখুন বা ম্যাথিয়াস আর জেসেনের সহায়ক উত্তরটি বিবেচনা করুন , যা পাওয়ারশেল এসডিকে ব্যবহার করে ।
মেমরিতে প্রসেস আউটপুট ক্যাপচার করার জন্য এবং নেট নেটওয়ার্কের সরাসরি ব্যবহারেরSystem.Diagnostics.Process
System.Diagnostics.ProcessStartInfo
উপর ভিত্তি করে একটি প্রমাণ-ধারণাটি রয়েছে (আপনার প্রশ্নে যেমন বলা হয়েছে, Start-Process
কোনও বিকল্প নয়, কারণ এটি কেবল ফাইলগুলিতে আউটপুট ক্যাপচারকে সমর্থন করে , যেমন এই উত্তরে দেখানো হয়েছে ) :
বিঃদ্রঃ:
ভিন্ন ব্যবহারকারী হিসাবে চলার কারণে, এটি কেবল উইন্ডোজে সমর্থিত (। নেট কোর 3.1 হিসাবে) তবে সেখানে পাওয়ারশেল উভয় সংস্করণেই।
ভিন্ন ব্যবহারকারী হিসাবে চালানোর প্রয়োজন হওয়ার কারণে এবং আউটপুট ক্যাপচার .WindowStyle
করার কারণে, লুকানো কমান্ডটি চালানোর জন্য ব্যবহার করা যাবে না (কারণ এটি হওয়া .WindowStyle
দরকার যা এই প্রয়োজনীয়তার সাথে সামঞ্জস্যপূর্ণ নয়); যাইহোক, যেহেতু সমস্ত আউটপুট ক্যাপচার করা হচ্ছে , কার্যকরভাবে গোপন বাস্তবায়নের ফলাফল নির্ধারণ করে ।.UseShellExecute
$true
.CreateNoNewWindow
$true
# Get the target user's name and password.
$cred = Get-Credential
# Create a ProcessStartInfo instance
# with the relevant properties.
$psi = [System.Diagnostics.ProcessStartInfo] @{
# For demo purposes, use a simple `cmd.exe` command that echoes the username.
# See the bottom section for a call to `powershell.exe`.
FileName = 'cmd.exe'
Arguments = '/c echo %USERNAME%'
# Set this to a directory that the target user
# is permitted to access.
WorkingDirectory = 'C:\' #'
# Ask that output be captured in the
# .StandardOutput / .StandardError properties of
# the Process object created later.
UseShellExecute = $false # must be $false
RedirectStandardOutput = $true
RedirectStandardError = $true
# Uncomment this line if you want the process to run effectively hidden.
# CreateNoNewWindow = $true
# Specify the user identity.
# Note: If you specify a UPN in .UserName
# (user@doamin.com), set .Domain to $null
Domain = $env:USERDOMAIN
UserName = $cred.UserName
Password = $cred.Password
}
# Create (launch) the process...
$ps = [System.Diagnostics.Process]::Start($psi)
# Read the captured standard output.
# By reading to the *end*, this implicitly waits for (near) termination
# of the process.
# Do NOT use $ps.WaitForExit() first, as that can result in a deadlock.
$stdout = $ps.StandardOutput.ReadToEnd()
# Uncomment the following lines to report the process' exit code.
# $ps.WaitForExit()
# "Process exit code: $($ps.ExitCode)"
"Running ``cmd /c echo %USERNAME%`` as user $($cred.UserName) yielded:"
$stdout
উপরেরটি নীচের মতো কিছু দেয়, প্রসেসটি সফলভাবে প্রদত্ত ব্যবহারকারীর পরিচয় দিয়ে চলেছে:
Running `cmd /c echo %USERNAME%` as user jdoe yielded:
jdoe
যেহেতু আপনি অন্য আহ্বান করছি PowerShell উদাহরণস্বরূপ , আপনি চাইতে পারেন সদ্ব্যবহার PowerShell CLI এর CLIXML বিন্যাস, যা আউটপুট deserializing দেয় আউটপুট প্রতিনিধিত্ব করার ক্ষমতা সমৃদ্ধ বস্তু , সীমিত টাইপ বিশ্বস্ততা যদ্যপি , যেমন ব্যাখ্যা এই সংশ্লিষ্ট উত্তর ।
# Get the target user's name and password.
$cred = Get-Credential
# Create a ProcessStartInfo instance
# with the relevant properties.
$psi = [System.Diagnostics.ProcessStartInfo] @{
# Invoke the PowerShell CLI with a simple sample command
# that calls `Get-Date` to output the current date as a [datetime] instance.
FileName = 'powershell.exe'
# `-of xml` asks that the output be returned as CLIXML,
# a serialization format that allows deserialization into
# rich objects.
Arguments = '-of xml -noprofile -c Get-Date'
# Set this to a directory that the target user
# is permitted to access.
WorkingDirectory = 'C:\' #'
# Ask that output be captured in the
# .StandardOutput / .StandardError properties of
# the Process object created later.
UseShellExecute = $false # must be $false
RedirectStandardOutput = $true
RedirectStandardError = $true
# Uncomment this line if you want the process to run effectively hidden.
# CreateNoNewWindow = $true
# Specify the user identity.
# Note: If you specify a UPN in .UserName
# (user@doamin.com), set .Domain to $null
Domain = $env:USERDOMAIN
UserName = $cred.UserName
Password = $cred.Password
}
# Create (launch) the process...
$ps = [System.Diagnostics.Process]::Start($psi)
# Read the captured standard output, in CLIXML format,
# stripping the `#` comment line at the top (`#< CLIXML`)
# which the deserializer doesn't know how to handle.
$stdoutCliXml = $ps.StandardOutput.ReadToEnd() -replace '^#.*\r?\n'
# Uncomment the following lines to report the process' exit code.
# $ps.WaitForExit()
# "Process exit code: $($ps.ExitCode)"
# Use PowerShell's deserialization API to
# "rehydrate" the objects.
$stdoutObjects = [Management.Automation.PSSerializer]::Deserialize($stdoutCliXml)
"Running ``Get-Date`` as user $($cred.UserName) yielded:"
$stdoutObjects
"`nas data type:"
$stdoutObjects.GetType().FullName
উপরের ফলাফলগুলি নীচের মতো কিছু করে, যা দেখায় যে [datetime]
উদাহরণ ( System.DateTime
) আউটপুট দ্বারা এর Get-Date
deserialized ছিল:
Running `Get-Date` as user jdoe yielded:
Friday, March 27, 2020 6:26:49 PM
as data type:
System.DateTime